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

72 lines
2.1 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/24 9:54
*/
package rocketmq
import (
"context"
"errors"
"github.com/apache/rocketmq-client-go/v2"
rmq_consumer "github.com/apache/rocketmq-client-go/v2/consumer"
"github.com/apache/rocketmq-client-go/v2/primitive"
"github.com/apache/rocketmq-client-go/v2/rlog"
"github.com/gogf/gf/v2/frame/g"
"github.com/tiger1103/gfast/v3/internal/app/mqueue/model"
"github.com/tiger1103/gfast/v3/internal/app/mqueue/service"
)
type rocketmqConsumer struct {
topic string
pushConsumer rocketmq.PushConsumer
}
// NewPushConsumer 创建MyRocketmq消费者实例
func NewPushConsumer(topic, groupName string, handler model.MQConsumerHandlerCallback) (service.IConsumer, error) {
endPoint := g.Cfg().MustGet(context.TODO(), "mqueue.rocketmq.nameServers").Strings()
logLevel := g.Cfg().MustGet(context.TODO(), "mqueue.rocketmq.logLevel").String()
if len(endPoint) < 1 {
return nil, errors.New("配置文件不正确获取mqueue.rocketmq.nameServers失败")
}
// 创建rocketmq实例
rlog.SetLogLevel(logLevel)
rmqC, err := rocketmq.NewPushConsumer(
rmq_consumer.WithNameServer(endPoint),
rmq_consumer.WithGroupName(groupName),
)
if err != nil {
return nil, err
}
err = rmqC.Subscribe(topic, rmq_consumer.MessageSelector{}, func(ctx context.Context, msgs ...*primitive.MessageExt) (rmq_consumer.ConsumeResult, error) {
for _, msg := range msgs {
var id model.MessageID
copy(id[:], msg.MsgId[:32])
handler(&model.MQMessage{
ID: id,
Body: msg.Body,
Attempts: 0,
Timestamp: msg.BornTimestamp,
})
}
// 无论如何都返回成功,消费失败自行在处理器里处理
return rmq_consumer.ConsumeSuccess, nil
})
err = rmqC.Start()
return &rocketmqConsumer{pushConsumer: rmqC}, nil
}
func (c *rocketmqConsumer) CloseMqConsumer() {
var err error
if c.pushConsumer != nil {
err = c.pushConsumer.Shutdown()
}
if err != nil {
g.Log("rocketmq").Error(context.TODO(), errors.New("rocketmq CloseMqConsumer 失败:"))
g.Log("rocketmq").Error(context.TODO(), err)
}
}