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