0/参考网址
blog.csdn.net/qq_28119741…
0/依赖的库包
github.com/apache/rocketmq-client-go/v2
复制代码
1/初始化
type MqConf struct {
NameServers []string `mapstructure:"nameServers"`
}
var (
MqProducer rocketmq.Producer
MqPushConsumerSuccess rocketmq.PushConsumer
MqPushConsumerFail rocketmq.PushConsumer
MqPushConsumerDelay rocketmq.PushConsumer
)
const (
MqRetryTimes = 3
)
func InitMq(mqConf *MqConf) {
if mqConf == nil {
panic("mq config is nil")
return
}
var err error
MqProducer, err = rocketmq.NewProducer(
producer.WithGroupName("notify_producer"),
producer.WithNameServer(mqConf.NameServers),
producer.WithRetry(MqRetryTimes),
)
if err != nil {
panic(fmt.Sprintf("init rocket mq producer err:%v", err))
return
}
err = MqProducer.Start()
if err != nil {
panic(fmt.Sprintf("producer mq start err:%v", err))
return
}
MqPushConsumerSuccess, err = rocketmq.NewPushConsumer(
consumer.WithGroupName("notify_consumer_success"),
consumer.WithNameServer(mqConf.NameServers),
)
if err != nil {
panic(fmt.Sprintf("init rocket mq push consumer err:%v", err))
return
}
MqPushConsumerFail, err = rocketmq.NewPushConsumer(
consumer.WithGroupName("notify_consumer_fail"),
consumer.WithNameServer(mqConf.NameServers),
)
if err != nil {
panic(fmt.Sprintf("init rocket mq push consumer err:%v", err))
return
}
MqPushConsumerDelay, err = rocketmq.NewPushConsumer(
consumer.WithGroupName("notify_consumer_delay"),
consumer.WithNameServer(mqConf.NameServers),
)
if err != nil {
panic(fmt.Sprintf("init rocket mq push consumer err:%v", err))
return
}
}
func ShutDownMq() {
_ = MqProducer.Shutdown()
_ = MqPushConsumerSuccess.Shutdown()
_ = MqPushConsumerFail.Shutdown()
_ = MqPushConsumerDelay.Shutdown()
}
复制代码
订阅
func SubScribe() {
var err error
err = conf.MqPushConsumerSuccess.Subscribe(include.TopicNotifySucess, consumer.MessageSelector{}, callBackSucc)
if err != nil {
panic(fmt.Sprintf("consumer subscribe TopicNotifySucess err:%v", err))
return
}
err = conf.MqPushConsumerFail.Subscribe(include.TopicNotifyFail, consumer.MessageSelector{}, callBackFail)
if err != nil {
panic(fmt.Sprintf("consumer subscribe TopicNotifyFail err:%v", err))
return
}
err = conf.MqPushConsumerDelay.Subscribe(include.TopicNotifyDelay, consumer.MessageSelector{}, callBackTimeOut)
if err != nil {
panic(fmt.Sprintf("consumer subscribe TopicNotifyDelay err:%v", err))
return
}
err = conf.MqPushConsumerSuccess.Start()
if err != nil {
panic(fmt.Sprintf("MqPushConsumerSuccess start err:%v", err))
return
}
err = conf.MqPushConsumerFail.Start()
if err != nil {
panic(fmt.Sprintf("MqPushConsumerFail start err:%v", err))
return
}
err = conf.MqPushConsumerDelay.Start()
if err != nil {
panic(fmt.Sprintf("MqPushConsumerDelay start err:%v", err))
return
}
}
func callBackSucc(ctx context.Context, msgs ...*primitive.MessageExt) (consumer.ConsumeResult, error) {
for i := range msgs {
fmt.Println(string(msgs[i].Body))
}
return consumer.ConsumeSuccess, nil
}
func callBackFail(ctx context.Context, msgs ...*primitive.MessageExt) (consumer.ConsumeResult, error) {
for i := range msgs {
fmt.Println(string(msgs[i].Body))
}
return consumer.ConsumeSuccess, nil
}
func callBackTimeOut(ctx context.Context, msgs ...*primitive.MessageExt) (consumer.ConsumeResult, error) {
for i := range msgs {
fmt.Println(string(msgs[i].Body))
}
return consumer.ConsumeSuccess, nil
}
复制代码
发送消息
const (
RetryTime = 3
SleepTime = time.Millisecond * 10
)
func SendSuccNotifyByMq(taskID string) (err error) {
msg := primitive.NewMessage(include.TopicNotifySucess, []byte(taskID))
for i := 0; i < RetryTime; i++ {
res, err := conf.MqProducer.SendSync(context.Background(), msg)
if err != nil {
time.Sleep(SleepTime)
continue
}
break
}
return
}
func SendFailNotifyByMq(taskID string) (err error) {
msg := primitive.NewMessage(include.TopicNotifyFail, []byte(taskID))
for i := 0; i < RetryTime; i++ {
res, err := conf.MqProducer.SendSync(context.Background(), msg)
if err != nil {
time.Sleep(SleepTime)
continue
}
break
}
return
}
func SendDelayNotifyByMq(taskID string) (err error) {
msg := primitive.NewMessage(include.TopicNotifyDelay, []byte(taskID))
msg.WithDelayTimeLevel(conf.C.DelayTime)
for i := 0; i < RetryTime; i++ {
res, err := conf.MqProducer.SendSync(context.Background(), msg)
if err != nil {
time.Sleep(SleepTime)
continue
}
break
}
return
}
复制代码