88 lines
2.3 KiB
Go
88 lines
2.3 KiB
Go
/**
|
|
* @Company: 云南奇讯科技有限公司
|
|
* @Author: yxf
|
|
* @Description:
|
|
* @Date: 2023/7/24 9:54
|
|
*/
|
|
|
|
package rocketmq
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"github.com/apache/rocketmq-client-go/v2"
|
|
"github.com/apache/rocketmq-client-go/v2/primitive"
|
|
rmq_producer "github.com/apache/rocketmq-client-go/v2/producer"
|
|
"github.com/gogf/gf/v2/frame/g"
|
|
"github.com/tiger1103/gfast/v3/internal/app/mqueue/consts"
|
|
"github.com/tiger1103/gfast/v3/internal/app/mqueue/service"
|
|
)
|
|
|
|
type producer struct {
|
|
rocketmqProducer rocketmq.Producer
|
|
}
|
|
|
|
// NewProducer 创建rocketmq生产者实例
|
|
func NewProducer() (service.IProducer, error) {
|
|
endPoint := g.Cfg().MustGet(context.TODO(), "mqueue.rocketmq.nameServers")
|
|
retry := g.Cfg().MustGet(context.TODO(), "mqueue.rocketmq.retry").Int()
|
|
groupName := g.Cfg().MustGet(context.TODO(), "mqueue.channel").String()
|
|
rmqP, err := rocketmq.NewProducer(rmq_producer.WithNameServer(endPoint.Strings()), rmq_producer.WithRetry(retry), rmq_producer.WithGroupName(groupName))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if rmqP == nil {
|
|
return nil, errors.New("创建生产者失败")
|
|
}
|
|
err = rmqP.Start()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &producer{rocketmqProducer: rmqP}, nil
|
|
}
|
|
|
|
func (p *producer) Publish(topic string, body []byte) error {
|
|
msg := &primitive.Message{
|
|
Topic: topic,
|
|
Body: body,
|
|
}
|
|
_, err := p.rocketmqProducer.SendSync(context.TODO(), msg)
|
|
return err
|
|
}
|
|
|
|
func (p *producer) PublishAsync(topic string, body []byte) error {
|
|
msg := &primitive.Message{
|
|
Topic: topic,
|
|
Body: body,
|
|
}
|
|
err := p.rocketmqProducer.SendAsync(context.TODO(), func(ctx context.Context, result *primitive.SendResult, err error) {
|
|
if err != nil {
|
|
g.Log("rocketmq").Error(context.TODO(), errors.New("rocketmq PublishAsync 失败:"))
|
|
g.Log("rocketmq").Error(context.TODO(), err)
|
|
}
|
|
}, msg)
|
|
return err
|
|
}
|
|
|
|
func (p *producer) DelayPublish(topic string, body []byte, delay consts.MsgDelayLevel) error {
|
|
msg := &primitive.Message{
|
|
Topic: topic,
|
|
Body: body,
|
|
}
|
|
if delay < 1 || delay > 18 {
|
|
delay = 1
|
|
}
|
|
msg.WithDelayTimeLevel(int(delay))
|
|
_, err := p.rocketmqProducer.SendSync(context.TODO(), msg)
|
|
return err
|
|
}
|
|
|
|
func (p *producer) Close() {
|
|
if p.rocketmqProducer != nil {
|
|
err := p.rocketmqProducer.Shutdown()
|
|
if err != nil {
|
|
g.Log("rocketmq").Error(context.TODO(), err)
|
|
}
|
|
}
|
|
}
|