我想在我的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 ... –