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);
}
}
在上面的代码中,我们定义了两个消费者服务,ConsumerService1
和ConsumerService2
,它们都订阅了主题TestTopic
,但是分别属于不同的消费者组my-consumer-group-1
和my-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服务器正在运行且可以连接
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端