我正在尝试在Spring Boot App中手动启动/停止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()
只是一种返回真实的方法。
即使我注册了几个带有这样注释的听众:
@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>
答案 0 :(得分:3)
你必须要有其他东西 - 我刚写了一个快速启动应用程序(1.4.1)并且容器没有启动......
@SpringBootApplication
public class So39654027Application {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(So39654027Application.class, args);
JmsListenerEndpointRegistry reg = context.getBean(JmsListenerEndpointRegistry.class);
MessageListenerContainer listenerContainer = reg.getListenerContainer("foo");
System.out.println(listenerContainer.isRunning());
}
@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;
}
@JmsListener(id="foo", destination = "so39654027", containerFactory = "queueContainerFactory")
public void listen(String foo) {
System.out.println(foo);
}
}
和...
2016-09-23 09:24:33.428 INFO 97907 --- [ main] com.example.So39654027Application : Started So39654027Application in 1.193 seconds (JVM running for 2.012)
false
我建议您在容器的start()
方法中使用调试器来查看它的启动原因。