spring-boot - 如何在 Spring Boot 中配置并发 rabbitmq 监听器?
问题描述
我已经设置了一个支持 RabbitMQ 的最小 Spring Boot 项目,我的使用者看起来像这样:
package app.mq.consumers;
import org.springframework.stereotype.Component;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import java.util.Date;
@Component
public final class StdoutConsumer {
@RabbitListener(
queues = {"stdout-q"},
concurrency = "5",
autoStartup = "true",
exclusive = false
)
public void receiveMessage(Object message) throws Exception {
Thread.sleep(1000);
System.out.println(new Date());
}
}
它只休眠 1 秒并在标准输出中打印一个时间戳。
这是application.yml
:
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
就这样。其他一切都完全不变。
我将 30 条消息推送到 RabbitMQ,然后启动 Spring Boot 应用程序,我希望看到大约同时打印 5 个时间戳(因为我将 设置concurrency
为"5"
),1 秒后,接下来是 5 个时间戳,依此类推。但是,我看到的是时间戳是一个一个打印出来的,任何两个时间戳之间的间隔大约是 1 秒。如果我将代码更改为休眠 5 秒,则每 2 个时间戳之间的间隔变为 5 秒。
但是,当我第一次启动 Spring Boot 应用程序然后快速将消息推送到 MQ 时,5 个消费者确实同时工作。
我猜这个问题来自消费者的初始化阶段,但是为什么 Spring 框架会一次性初始化消费者呢?我怎样才能让它们立即开始而不是一个一个开始?
解决方案
推荐阅读
- ansible - Ansible - 调用救援后跳过块中的其他任务
- python - 如何解决Kivy中的“.kv多次加载”错误?
- java - 获取算法的运行时间
- macos - 如何从苹果遥控器捕获事件?
- python - 使用 openCV 裁剪简单的边界框
- r - 为什么 weekdays 在德语中返回工作日?
- verilog - 等效于verilog文件中的系统verilog打包输入输出
- python - 使用多个关键字对象引用的 Django Rest Framework 对象
- python - 将值输入到列表中并循环直到给出参数
- react-native - React-Native 导航:在组件之间共享数据,当状态改变时更新参数