java - 具有多个消费者的 Spring Boot RabbitMQ 单队列
问题描述
我是 Rabbitmq 的新手,我想对多个消费者使用单个队列,请帮助我处理多个消费者,我们如何处理来自单个队列的多个消费者的请求?
下面是我的单队列和单消费者代码
我的配置类
@Configuration
public class ConfigureRabbitMq {
public static final String EXCHANGE_NAME = "mikeexchange2";
public static final String QUEUE_NAME = "mikequeue2";
@Bean
Queue createQueue() {
return new Queue(QUEUE_NAME, true, false, false);
}
@Bean
TopicExchange exchange(){
return new TopicExchange(EXCHANGE_NAME);
}
@Bean
Binding binding(Queue q, TopicExchange exchange){
return BindingBuilder.bind(q).to(exchange).with("mike.#");
}
@Bean
SimpleMessageListenerContainer container(ConnectionFactory connectionFactory
, MessageListenerAdapter messageListenerAdapter){
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.setQueueNames(QUEUE_NAME);
container.setMessageListener(messageListenerAdapter);
return container;
}
@Bean
MessageListenerAdapter listenerAdapter(Receive handler){
return new MessageListenerAdapter(handler, "handleMessage");
}
}
我的接收器类
@Service
public class Receive {
public void handleMessage(String messageBody){
System.out.println("HandleMessage!!!");
System.out.println(messageBody);
}
}
我的发件人类
@RestController
public class Send {
private final RabbitTemplate rabbitTemplate;
public Send(RabbitTemplate rabbitTemplate) {
this.rabbitTemplate = rabbitTemplate;
}
@RequestMapping(method = RequestMethod.GET, value = "/api/send/{msg}")
public String sendMessage(@PathVariable("msg") String themessage){
for(int i=0;i<5000000;i++) {
rabbitTemplate.convertAndSend(ConfigureRabbitMq.EXCHANGE_NAME,
"mike.springmessages", themessage+""+Integer.toString(i));
}
return "We have sent a message! :" + themessage;
}
}
解决方案
根据您的评论,您实际上还算不错。但就像 Nik 所说,使用默认配置,您可以实现负载平衡循环。
如果您使用 spring-boot,请确保为spring-boot-starter-amqp
.
在您的接收方,您通常会拥有以下内容:
@Service
public class Receive {
@RabbitListener(queues = "<queueName>", concurrency = <numConsumersPerInstance>)
public void handleMessage(String messageBody){
...
}
提供并发参数可以在一个服务实例中实现多线程消息消费。如果您真的希望一个实例同时只使用一条消息,您可以将其设置为 1。检查源代码以@RabbitListener
获取有关并发的进一步指导。
推荐阅读
- javascript - 如何使用后端文件夹内的前端将 MERN 应用程序部署到 Heroku
- javascript - Http PUT 删除未更改的数据
- javascript - 如何将 Firebase 存储中的图像显示到我的网站?
- java - 为什么 Spring 在保存用户时告诉我控制器是未知实体?
- c - 如何在c编程中比较结构变量的值
- data-manipulation - 如何根据列/变量中的观察数向数据集添加行?
- javascript - JQuery 选择器 - 如何使用不同的 id 复制到剪贴板
- javascript - 从 Office Fabric UI 获取切换元素的值
- json - Django:将当前登录用户作为 JSON 发送
- c - 扫描二进制数的方法?