Rocketmq实现 同一组+同一topic+多个消费者 测试消息消费模式(广播模式、集群模式)

1,870 阅读1分钟

1、实现多消费者需要注意的地方

1.1、报错java.lang.RuntimeException: java.lang.IllegalStateException: Failed to start RocketMQ push consumer

image.png

1.2、解决方案:实现RocketMQPushConsumerLifecycleListener接口,需要设置instanceName 为不同内容

image.png

2、生产者发送简单消息代码

image.png

@Autowired
private RocketMQTemplate rocketMQTemplate;

// http://localhost:8085/mq/producer/sendSimpleMsg
// 发送简单消息
@GetMapping(value = "/sendSimpleMsg")
public Object sendSimpleMsg() {

    for (int i = 0; i < 10; i++) {
        rocketMQTemplate.syncSend(MqAnnotionConstant.STUDY_SIMPLE_TOPIC, "这是一个简单消息"+i);
    }

    return "发送结束";
}

3、消费者实现代码

package com.wangzhan.listener;

import com.wangzhan.constant.MqAnnotionConstant;
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.spring.annotation.MessageModel;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.apache.rocketmq.spring.core.RocketMQPushConsumerLifecycleListener;
import org.springframework.stereotype.Component;

/**
 * @author wangzhan
 * @version 1.0
 * @description 简单消息的监听
 * @date 2023/8/2 14:10:44
 */
/**
 * 创建一个简单消息的监听
 * 1.类上添加注解@Component@RocketMQMessageListener
 *      @RocketMQMessageListener(topic = "powernode", consumerGroup = "powernode-group")
 *      topic指定消费的主题,consumerGroup指定消费组,一个主题可以有多个消费者组,一个消息可以被多个不同的组的消费者都消费
 * 2.实现RocketMQListener接口,注意泛型的使用,可以为具体的类型,如果想拿到消息
 * 的其他参数可以写成MessageExt
 */
@Component
// 集群模式
//@RocketMQMessageListener(topic = MqAnnotionConstant.STUDY_SIMPLE_TOPIC, consumerGroup = MqAnnotionConstant.STUDY_SIMPLE_GROUP, messageModel = MessageModel.CLUSTERING)
// 广播模式
@RocketMQMessageListener(topic = MqAnnotionConstant.STUDY_SIMPLE_TOPIC, consumerGroup = MqAnnotionConstant.STUDY_SIMPLE_GROUP, messageModel = MessageModel.BROADCASTING)
public class SimpleMsgListener implements RocketMQListener<String>, RocketMQPushConsumerLifecycleListener {
    @Override
    public void onMessage(String s) {
        System.out.println("consumer1消费消息:" + s);
    }

    @Override
    public void prepareStart(DefaultMQPushConsumer defaultMQPushConsumer) {
        defaultMQPushConsumer.setInstanceName("consumer1");
    }
}
@Component
// 集群模式
//@RocketMQMessageListener(topic = MqAnnotionConstant.STUDY_SIMPLE_TOPIC, consumerGroup = MqAnnotionConstant.STUDY_SIMPLE_GROUP, messageModel = MessageModel.CLUSTERING)
// 广播模式
@RocketMQMessageListener(topic = MqAnnotionConstant.STUDY_SIMPLE_TOPIC, consumerGroup = MqAnnotionConstant.STUDY_SIMPLE_GROUP, messageModel = MessageModel.BROADCASTING)
public class SimpleMsgListener2 implements RocketMQListener<String>, RocketMQPushConsumerLifecycleListener {
    @Override
    public void onMessage(String s) {
        System.out.println("consumer2消费消息:" + s);
    }

    // 实现 RocketMQPushConsumerLifecycleListener接口,用来解决 多个消费者 使用同一个组,同一个topic的 启动问题
    @Override
    public void prepareStart(DefaultMQPushConsumer defaultMQPushConsumer) {
        defaultMQPushConsumer.setInstanceName("consumer2");
    }
}

4、实现效果

4.1、广播模式

image.png

4.2、集群模式

image.png

5、完整代码(包含原生api + 注解方式)测试例子

代码地址