Rockemq同个ConsumerGroup启动多个consumer

Java Rocketmq中同个ConsumerGroup启动多个consumer

起因

在学习Rockemq时,看到网上资料说的同个ConsumerGroup下的consumer的分配问题,故想在代码中实践一番,但是查阅了很多资料,并没有发现在同个消费组创建多个消费者的情况,遂自行摸索

实践

首先在Consumer1类中生成一个普通的Consumer:

@Data
@Component
@Slf4j
public class Consumer1 {
    @Autowired
    private JmsConfig jmsConfig;
    private DefaultMQPushConsumer consumer;

    @PostConstruct
    @SneakyThrows
    public void init() {
        consumer = new DefaultMQPushConsumer(jmsConfig.getConsumerGroup());
        consumer.setNamesrvAddr(jmsConfig.getNameSrvAddr());
        consumer.setVipChannelEnabled(false);

        consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET);
        consumer.subscribe("testTopic1", "*");

        consumer.setMessageListener((MessageListenerConcurrently) (list, consumeConcurrentlyContext) -> {
            try {
                for (MessageExt messageExt : list) {
                    String body = new String(messageExt.getBody(), RemotingHelper.DEFAULT_CHARSET);
                    log.info("From consumer1111 topic:{},消息内容:{},msgId:{},key:{}", messageExt.getTopic(), body, messageExt.getMsgId(), messageExt.getKeys());
                }
            } catch (Exception exception) {
                exception.printStackTrace();
                return ConsumeConcurrentlyStatus.RECONSUME_LATER;
            }
            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
        });

        //开始消费
        consumer.start();
    }
}

接着启动,能正常消费信息:
consumer1正常消费
接着想启动多一个consumer,于是复制了一个consumer取名为consumer2,代码与consumer1完全一致,这时候启动提示:

Invocation of init method failed; nested exception is org.apache.rocketmq.client.exception.MQClientException: The producer group[testProducerGroup1] has been created before, specify another name please.

已经有同名的消费组了,叫我换个名字,ok,那我在同个消费组start多次呢?所以我先把consumer2代码注释了,在consumer1下start了多次,看看能否启动多个消费者:
多次start
果然,失败了:

Invocation of init method failed; nested exception is org.apache.rocketmq.client.exception.MQClientException: The PushConsumer service state not OK, maybe started once, RUNNING

提示我说,只需要start一次就好, 别给我start那么多次!害,后来灵机一动想到在学习Producer的时候的instanceName,想起是否Consumer也是如此机制呢?于是去掉多余的start,把consumer1和consumer2分别设置了不同的instanceName:
consumer1添加如下:

        consumer.setInstanceName("instance1");

consumer2添加如下:

        consumer.setInstanceName("instance2");

重启代码后,果然成功了,各自消费了不同的Message
在这里插入图片描述

总结

设置ConsumerGroup多个consumer时,只需要生成consumer时设置不同的instanceName即可!
如有更好的方法,欢迎评论指教
ps:如果是多个ConsumerGroup订阅了同个Topic,那么一个Message将会被多个ConsumerGroup消费

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值