2023-08-11 18:00:35 +08:00

91 lines
2.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @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
}