spring-amqp - 当 autoStartup = false 时 Spring AMQP Listener 启动
问题描述
最近遇到了 Spring AMQP 的一个奇怪问题@EventListener
。监听器是这样声明的,所以自动启动设置为false
@RabbitListener(id = "MqMessageHandler", queues = "${rabbitMQ.in-queue-name}", autoStartup = "false")
public void receiveMessage(Message message) {
在应用程序完全初始化并且我从其他一些服务获得响应后,我正在像这样手动启动侦听器
MessageListenerContainer mqMessageHandler = registry.getListenerContainer(HANDLER_ID);
mqMessageHandler.start();
但似乎侦听器仍在启动上下文初始化。在代码中挖掘了一下,我在里面找到了这段代码RabbitListenerEndpointRegistry
/**
* Start the specified {@link MessageListenerContainer} if it should be started
* on startup or when start is called explicitly after startup.
* @param listenerContainer the container.
* @see MessageListenerContainer#isAutoStartup()
*/
private void startIfNecessary(MessageListenerContainer listenerContainer) {
if (this.contextRefreshed || listenerContainer.isAutoStartup()) {
listenerContainer.start();
}
}
这意味着一旦ContextRefreshed
事件被触发,监听器就会被启动。我希望条件是
this.contextRefreshed && listenerContainer.isAutoStartup()
这样,&&
而不是||
然后它应该按预期工作。
有谁知道条件是否正确,我的假设是否错误?Spring AMQP 版本2.3.1
与我在2.3.10
作为现在的解决方法,我正在像这样手动注册侦听器
MessageListenerContainer mqMessageHandler = registry.getListenerContainer(HANDLER_ID);
if (Objects.isNull(mqMessageHandler)) {
SimpleRabbitListenerEndpoint endpoint = new SimpleRabbitListenerEndpoint();
endpoint.setQueueNames(inQueueName);
endpoint.setMessageListener(this.mqMessageHandler);
endpoint.setId(HANDLER_ID);
registry.registerListenerContainer(endpoint, factory);
mqMessageHandler = registry.getListenerContainer(HANDLER_ID);
}
mqMessageHandler.start();
解决方案
所以经过调查发现:
- Spring AMQP 按预期工作,并没有按预期在启动时启动侦听器。
- 就我而言,这是一个问题,它是
context.refresh()
从context.start()
内部平台的代码中手动调用的。在这种情况下,contextRefreshed
标志 inRabbitListenerEndpointRegistry
设置为 true,并且在第二次调用startIfNecessary
(因为context.start()
)监听器期间启动。
推荐阅读
- python-3.x - 如何进入 docker 容器并使用 Paramiko 模块在 Python 中重新启动服务?
- nginx - 是否可以在 nginx 上设置“完整请求”超时?
- python - 在编辑时删除并重新添加数据库子项
- python - 我如何能够在文件中搜索输入并在函数中打印它们
- sql - Postgresql 使用 Limit 和 Order by 没有 select 和 where 大小写
- javascript - ajax 请求的原子性
- python - 没有类变量的类数或更好的选择
- javascript - 单击嵌套 HTML 元素的 2 级时避免触发 1 级的事件(使用 JQuery)
- python - TensorFlow 测量预测 GPU 时间
- sql - 将 XML 数据上传到 SQL Server