我想在我的Spring Boot App中手动启动/停止JMS监听器。我目前使用下面的配置我的容器厂:Spring Boot JMS AutoStartup
@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听众
的无效状态我发现一对夫妇出现不一致的在我的豆子:
jmsListenerEndpointRegistry.getListenerContainerIds().size()
始终是0 jmsListenerEndpointRegistry.isAutoStartup()
仅仅是一个真正的回报的方法。
即使我注册注释的几个听众的是这样的:
@JmsListener(containerFactory="queueContainerFactory", destination = "${dest}")
jmsListenerEndpointRegistry
不显示这些监听器的状态信息,但它们连接到的ActiveMQ上启动。 (检查ActiveMQ的管理控制台)
编辑2:@JmsListener甚至开始自动启动设置为false
我检查了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启动时调用run()。可以由run()调用吗? – crm86
请分享一下我们这个GitHub上的一些简单的Spring Boot应用程序。我记得Spring Cloud Stream有一个'start()'问题,BTW ... –