RocketMQ创建多个消费者问题分析

问题描述:

在一个进程中同一个消费组创建多个消费者会出现The consumer group [groupName] has been created before, specify another name please.

        DefaultMQPushConsumer consumer1 = new DefaultMQPushConsumer();
        consumer1.setConsumerGroup(groupName);
        consumer1.setNamesrvAddr(namesServer);
        consumer1.start();

        DefaultMQPushConsumer consumer2 = new DefaultMQPushConsumer();
        consumer2.setConsumerGroup(groupName);
        consumer2.setNamesrvAddr(namesServer);
        consumer2.start();

原因分析:

org.apache.rocketmq.client.impl.consumer.DefaultMQPushConsumerImpl#start()

boolean registerOK = mQClientFactory.registerConsumer(this.defaultMQPushConsumer.getConsumerGroup(), this);
    public boolean registerConsumer(final String group, final MQConsumerInner consumer) {
        if (null == group || null == consumer) {
            return false;
        }

        MQConsumerInner prev = this.consumerTable.putIfAbsent(group, consumer);
        if (prev != null) {
            log.warn("the consumer group[" + group + "] exist already.");
            return false;
        }

        return true;
    }
    if (!registerOK) {
        this.serviceState = ServiceState.CREATE_JUST;
        this.consumeMessageService.shutdown();
        throw new MQClientException("The consumer group[" + this.defaultMQPushConsumer.getConsumerGroup()
                + "] has been created before, specify another name please." + FAQUrl.suggestTodo(FAQUrl.GROUP_NAME_DUPLICATE_URL),
                null);
    }

可以看到 在注册消费者的时候是以消费者组作为key,消费者作为value存到消费者缓存Map中,因此在同一个客户端实例使用相同的消费者组会提示The consumer group has been created before, specify another name please.


解决方案:

  1. 使用 不同消费者组
  2. 使用不同的客户端实例(参考 https://blog.csdn.net/weixin_35973945/article/details/109090827
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
可以通过创建多个消费者来实现RocketMQ消息的并发处理,以下是Java代码示例: ```java public class ConsumerGroupExample { public static void main(String[] args) throws InterruptedException, MQClientException { DefaultMQPushConsumer consumer1 = new DefaultMQPushConsumer("group1"); consumer1.setNamesrvAddr("localhost:9876"); consumer1.subscribe("Topic1", "Tag1"); DefaultMQPushConsumer consumer2 = new DefaultMQPushConsumer("group1"); consumer2.setNamesrvAddr("localhost:9876"); consumer2.subscribe("Topic1", "Tag1"); consumer1.registerMessageListener(new MessageListenerConcurrently() { @Override public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) { System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), msgs); return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; } }); consumer2.registerMessageListener(new MessageListenerConcurrently() { @Override public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) { System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), msgs); return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; } }); consumer1.start(); consumer2.start(); System.out.printf("Consumer Started.%n"); } } ``` 这里创建了两个消费者,并使用相同的消费者组名(group1),它们都订阅了Topic1和Tag1的消息。每个消费者都注册了一个消息监听器,用于处理收到的消息。最后,通过调用start()方法启动消费者。由于两个消费者都属于同一个消费者组,它们将共同消费Topic1和Tag1的消息,并且每个消息只会被一个消费者处理。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值