【发布时间】:2017-01-31 21:59:06
【问题描述】:
我正在尝试在我的 Spring Boot 应用程序中手动启动/停止 JMS 侦听器。我目前正在对我的容器工厂使用以下配置:
@EnableJms
public class ConfigJms {
...
@Bean(name = "queueContainerFactory")
public JmsListenerContainerFactory<?> queueContainerFactory(ConnectionFactory cf) {
ActiveMQConnectionFactory amqCf = (ActiveMQConnectionFactory) cf;
amqCf.setTrustAllPackages(true);
SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
factory.setConnectionFactory(amqCf);
**factory.setAutoStartup(false);**
return factory;
}
...
}
在测试factory.setAutoStartup(false); 之后,我很困惑,因为即使指示不为此工厂容器启动任何侦听器,侦听器也已经注册并在上下文启动时启动。
我使用jmsListenerEndpointRegistry 测试了这种情况。
jmsListenerEndpointRegistry.isAutoStartup() is true 和
jmsListenerEndpointRegistry. isRunning () is true 执行前jmsListenerEndpointRegistry.start();
是否需要配置其他东西?也许我忽略了一些自动配置。
编辑 1:JmsListenerEndpointRegistry 侦听器的状态无效
我在我的 bean 中发现了一些不一致的地方:
jmsListenerEndpointRegistry.getListenerContainerIds().size() 始终为 0。
jmsListenerEndpointRegistry.isAutoStartup() 只是一个返回 true 的方法。
即使我用这样的注释注册了几个监听器:
@JmsListener(containerFactory="queueContainerFactory", destination = "${dest}")
jmsListenerEndpointRegistry 不显示有关这些侦听器状态的信息,但它们在启动时连接到 ActiveMQ。 (检查 ActiveMQ 管理控制台)
编辑 2:即使自动启动设置为 false,@JmsListener 也会启动
我检查了每个容器的jmsListenerEndpointRegistry,但我不知道这是一个错误还是我没有正确定义配置。但是,我只是按照前面的说明定义容器工厂,将 AUTO-START 设置为 false,并且两个侦听器都已启动并使用消息(正在运行)。
来自我的日志文件:
jmsListenerEndpointRegistry ID <org.springframework.jms.JmsListenerEndpointContainer#1>, Auto-Startup <false>, Running <true>
jmsListenerEndpointRegistry ID <org.springframework.jms.JmsListenerEndpointContainer#0>, Auto-Startup <false>, Running <true>
【问题讨论】:
-
您是否在应用程序上下文中明确使用
start()?autoStartup仅与上下文初始化期间的上下文调用有关。在创建后在上下文上调用start()时它没有任何影响,这会启动所有 bean,而不管autoStartup。 -
没有。我只是在 spring boot 上调用 run () 。可以被子 run() 调用吗?
-
请在 GitHub 上分享我们这边的一些简单的 Spring Boot 应用程序。我记得Spring Cloud Stream有一个
start()的问题,顺便说一句...
标签: spring spring-boot spring-integration ioc-container spring-jms