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  }