0

我想在我的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 truejmsListenerEndpointRegistry. 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> 
+1

你在应用程序上下文中做了一个明确的'start()'吗? 'autoStartup'只涉及上下文初始化期间的上下文调用开始。它在创建后在上下文中调用'start()'时不起作用,它会启动所有bean,而不管'autoStartup'。 –

+0

不,我只是在spring启动时调用run()。可以由run()调用吗? – crm86

+0

请分享一下我们这个GitHub上的一些简单的Spring Boot应用程序。我记得Spring Cloud Stream有一个'start()'问题,BTW ... –

回答

1

你必须有别的事情 - 我只是写了一个快速启动的应用程序(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()一个调试器,看看它为什么正在启动。

+0

这是我的错误。我正在执行两次JmsListenerEndpointRegistry。对start()的调试也很有用。 – crm86