rocketmq--同一主题,不同队列

在RocketMQ中,一个主题(Topic)可以有多个队列(Queue),生产者发送消息时可以指定消息要发送到的队列。消费者在订阅主题时,可以通过实现MessageListener来消费指定队列的消息。

在Spring Boot中,你可以通过配置消费者监听器来指定消费特定队列的消息。以下是一个简单的例子,展示如何实现针对同一主题不同队列的消费。

首先,确保你已经添加了RocketMQ的依赖并配置了application.yml文件。

然后,你可以创建一个消费者服务,并通过@RocketMQMessageListener注解来指定主题和消费者组,以及selectorExpression来指定标签(Tags)。如果你想要消费特定的队列,你可能需要在消费者中手动指定队列ID。

import org.apache.rocketmq.spring.annotation.ConsumeMode;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Service;

@Service
@RocketMQMessageListener(topic = "TestTopic", consumerGroup = "my-consumer-group-1", selectorExpression = "*", consumeMode = ConsumeMode.CONCURRENTLY)
public class ConsumerService1 implements RocketMQListener<String> {
    @Override
    public void onMessage(String message) {
        System.out.println("Consumer1 received: " + message);
    }
}

@Service
@RocketMQMessageListener(topic = "TestTopic", consumerGroup = "my-consumer-group-2", selectorExpression = "*", consumeMode = ConsumeMode.CONCURRENTLY)
public class ConsumerService2 implements RocketMQListener<String> {
    @Override
    public void onMessage(String message) {
        System.out.println("Consumer2 received: " + message);
    }
}

在上面的代码中,我们定义了两个消费者服务,ConsumerService1ConsumerService2,它们都订阅了主题TestTopic,但是分别属于不同的消费者组my-consumer-group-1my-consumer-group-2。在RocketMQ中,同一个消费者组内的消费者会共享主题的队列,负载均衡地消费消息。不同的消费者组可以分别消费主题下的所有消息,实现消息的广播消费。

如果你需要指定特定的队列,RocketMQ提供了MessageQueueSelector接口,你可以实现该接口来选择特定的队列。然而,在rocketmq-spring-boot-starter中,这需要你自己实现消费逻辑,而不是使用@RocketMQMessageListener提供的简单方式。

生产者发送消息到特定队列的例子:

import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.MessageQueueSelector;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageQueue;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
public class ProducerService {
    private final DefaultMQProducer producer;

    public ProducerService() {
        // 初始化生产者并启动
        producer = new DefaultMQProducer("my-producer-group");
        producer.setNamesrvAddr("127.0.0.1:9876");
        producer.start();
    }

    public void sendMessageToSpecificQueue(String topic, String tags, String keys, String body, int queueNumber) throws Exception {
        Message msg = new Message(topic, tags, keys, body.getBytes());
        producer.send(msg, new MessageQueueSelector() {
            @Override
            public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {
                Integer id = (Integer) arg;
                return mqs.get(id);
            }
        }, queueNumber);
    }
}

在上面的生产者代码中,我们通过实现MessageQueueSelector接口的select方法,来发送消息到指定的队列queueNumber

请注意,上述代码仅作为示例,实际开发时需要根据你的具体需求和RocketMQ的配置进行调整。此外,确保RocketMQ服务器正在运行且可以连接

posted @   xylfjk  阅读(571)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示