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. 使用不同的客户端实例(参考 )
经验分享 程序员 微信小程序 职场和发展