gitee.com/h79/goutils@v1.22.10/mq/push_consumer.go (about) 1 package mq 2 3 import ( 4 "context" 5 "gitee.com/h79/goutils/common/result" 6 "github.com/apache/rocketmq-client-go/v2" 7 "github.com/apache/rocketmq-client-go/v2/consumer" 8 "github.com/apache/rocketmq-client-go/v2/primitive" 9 ) 10 11 var _ Consumer = (*pushConsumer)(nil) 12 13 type pushConsumer struct { 14 cfg Config 15 consumer rocketmq.PushConsumer 16 } 17 18 func NewPushConsumer(cfg Config) Consumer { 19 return &pushConsumer{cfg: cfg} 20 } 21 22 func (con *pushConsumer) Start() error { 23 24 p, e := rocketmq.NewPushConsumer( 25 consumer.WithGroupName(con.cfg.Client.GroupName), 26 consumer.WithNsResolver(primitive.NewPassthroughResolver([]string{con.cfg.Client.Server})), 27 consumer.WithCredentials(primitive.Credentials{ 28 AccessKey: con.cfg.Credentials.AccessKey, 29 SecretKey: con.cfg.Credentials.SecretKey, 30 SecurityToken: con.cfg.Credentials.SecretToken}, 31 ), 32 consumer.WithInstance(con.cfg.Client.InstanceName), 33 consumer.WithNameServerDomain(con.cfg.Client.Domain), 34 ) 35 if e != nil { 36 return result.Errorf(result.ErrMqInitInternal, "[MQ] Init push consumer failed, error: %v", e).Log() 37 } 38 39 if e := p.Start(); e != nil { 40 return result.Errorf(result.ErrMqStartInternal, "[MQ] Start push consumer failed, error: %v", e).Log() 41 } 42 con.consumer = p 43 return nil 44 } 45 46 func (con *pushConsumer) Stop() { 47 _ = con.consumer.Shutdown() 48 } 49 50 func (con *pushConsumer) Subscribe(topic Topic, exp Expression, call func(msg *Message) Status) error { 51 52 err := con.consumer.Subscribe(topic.Topic, consumer.MessageSelector{ 53 Type: consumer.ExpressionType(exp.Type), 54 Expression: exp.Exp, 55 }, func(ctx context.Context, 56 msgs ...*primitive.MessageExt) (consumer.ConsumeResult, error) { 57 for _, mq := range msgs { 58 m := Message{ 59 MsgId: mq.MsgId, 60 } 61 switch call(&m) { 62 case ConFail: 63 return consumer.ConsumeRetryLater, nil 64 } 65 } 66 return consumer.ConsumeSuccess, nil 67 }) 68 return err 69 }