91 lines
2.3 KiB
Go
91 lines
2.3 KiB
Go
/**
|
||
* @Company: 云南奇讯科技有限公司
|
||
* @Author: yxf
|
||
* @Description:
|
||
* @Date: 2023/7/3 10:44
|
||
*/
|
||
|
||
package nsq
|
||
|
||
import (
|
||
"context"
|
||
"errors"
|
||
"fmt"
|
||
"github.com/gogf/gf/v2/frame/g"
|
||
"github.com/nsqio/go-nsq"
|
||
"github.com/tiger1103/gfast/v3/internal/app/mqueue/model"
|
||
"github.com/tiger1103/gfast/v3/internal/app/mqueue/service"
|
||
)
|
||
|
||
type nsqConsumer struct {
|
||
consumer *nsq.Consumer
|
||
nsqConfig *nsqConsumerConnConfig
|
||
Handler model.MQConsumerHandlerCallback
|
||
}
|
||
|
||
type nsqConsumerConnConfig struct {
|
||
Addr string // NsqLookupd 服务器地址
|
||
Port uint // 服务器端口号
|
||
LocalAddr string // 本地IP地址
|
||
AuthSecret string // 认证秘钥
|
||
LookupdAuthorization bool // 是否开启认证
|
||
}
|
||
|
||
func (c *nsqConsumer) CloseMqConsumer() {
|
||
c.consumer.Stop()
|
||
}
|
||
|
||
// HandleMessage 处理go_nsq转发的消息,返回nil则表式处理完成
|
||
func (c *nsqConsumer) HandleMessage(m *nsq.Message) error {
|
||
// 空消息不用处理
|
||
if len(m.Body) == 0 {
|
||
return nil
|
||
}
|
||
var id model.MessageID
|
||
copy(id[:], m.ID[:16])
|
||
mqMsgRes := &model.MQMessage{
|
||
ID: id,
|
||
Body: m.Body,
|
||
Timestamp: m.Timestamp,
|
||
}
|
||
return c.Handler(mqMsgRes)
|
||
}
|
||
|
||
// NewNsqConsumer 创建NSQConsumer实例
|
||
func NewNsqConsumer(topic, channel string, handler model.MQConsumerHandlerCallback) (service.IConsumer, error) {
|
||
addr := g.Cfg().MustGet(context.TODO(), "mqueue.nsq.address").String()
|
||
port := g.Cfg().MustGet(context.TODO(), "mqueue.nsq.consumer_port").Uint()
|
||
if addr == "" || port < 1 {
|
||
return nil, errors.New("nsq 配置读取错误")
|
||
}
|
||
|
||
config := nsq.NewConfig()
|
||
consumer, err := nsq.NewConsumer(topic, channel, config)
|
||
|
||
consumer.SetLoggerLevel(nsq.LogLevel(2))
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
nsqConsumerConfig := &nsqConsumerConnConfig{
|
||
Addr: addr,
|
||
Port: port,
|
||
}
|
||
nsqC := &nsqConsumer{
|
||
nsqConfig: nsqConsumerConfig,
|
||
consumer: consumer,
|
||
Handler: handler,
|
||
}
|
||
// 添加消息处理器
|
||
consumer.AddHandler(nsqC)
|
||
err = consumer.ConnectToNSQLookupd(fmt.Sprintf("%s:%d", nsqConsumerConfig.Addr, nsqConsumerConfig.Port))
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
stats := consumer.Stats()
|
||
if stats.Connections <= 0 {
|
||
nsqC = nil
|
||
err = errors.New("未能连接到nsq lookup 服务器,请检查错误日志")
|
||
}
|
||
return nsqC, err
|
||
}
|