RocketMQ 是一种高性能、低延迟的分布式消息中间件,可以广泛应用于大规模分布式系统中的消息通信场景。在 RocketMQ 中,消费者可以通过两种方式来消费消息:广播式消费和并发消费。广播式消费是指每个消费者都可以接收到同一条消息,而并发消费是指多个消费者可以并发地消费同一组消息。

下面我将向你介绍如何实现 RocketMQ 的广播式消费和并发消费。整个过程可以分为以下几个步骤:

步骤一:创建消费者组 首先,你需要创建一个消费者组。消费者组是一组共享同一个消费者组名的消费者的集合。消费者组名在 RocketMQ 中唯一标识一个消费者组。你可以通过以下代码创建一个消费者组:

DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("consumer_group");

步骤二:设置NameServer地址 NameServer 是 RocketMQ 的核心组件,用于管理和维护所有的 Broker 节点信息。你需要设置 NameServer 的地址,以便消费者可以与之建立连接。你可以通过以下代码设置 NameServer 的地址:

consumer.setNamesrvAddr("127.0.0.1:9876");

步骤三:设置订阅关系 接下来,你需要设置消费者的订阅关系。订阅关系决定了消费者将消费哪些主题(Topic)下的消息。你可以通过以下代码设置订阅关系:

consumer.subscribe("topic_name", "*");

其中,第一个参数是主题名称,第二个参数是用于过滤消息的表达式。在这里,我使用了通配符 *,表示订阅该主题下的所有消息。

步骤四:设置消息模式 然后,你需要设置消费者的消息模式。在广播式消费中,每个消费者都可以接收到同一条消息,而在并发消费中,多个消费者可以并发地消费同一组消息。你可以通过以下代码设置消息模式:

consumer.setMessageModel(MessageModel.BROADCASTING);

如果你想使用并发消费模式,可以将 MessageModel.BROADCASTING 替换为 MessageModel.CLUSTERING

步骤五:注册消息监听器 最后,你需要注册一个消息监听器,用于处理接收到的消息。你可以通过以下代码注册消息监听器:

consumer.registerMessageListener(new MessageListenerConcurrently() {
    @Override
    public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> messages, ConsumeConcurrentlyContext context) {
        for (MessageExt message : messages) {
            // 处理接收到的消息
        }
        return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
    }
});

在这里,你需要实现 MessageListenerConcurrently 接口,并重写 consumeMessage 方法。在 consumeMessage 方法中,你可以处理接收到的消息。返回值 ConsumeConcurrentlyStatus.CONSUME_SUCCESS 表示消息消费成功。

至此,你已经完成了 RocketMQ 广播式消费和并发消费的实现。下面是一个完整的示例代码:

import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.common.message.MessageQueue;
import org.apache.rocketmq.common.protocol.heartbeat.MessageModel;

import java.util.List;

public class RocketMQConsumer {
    public static void main(String[] args) throws MQClientException {
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("consumer_group");
        consumer.setNamesrvAddr("127.0.0.1:9876");
        consumer.subscribe("topic_name", "*");
        consumer.setMessageModel(MessageModel.BROADCASTING);
        consumer.registerMessageListener(new MessageListenerConcurrently() {
            @Override
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> messages, ConsumeConcurrentlyContext context) {
                for (MessageExt message : messages) {
                    // 处理接收到的消息
                }
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });
        consumer.start();