2016-03-31 146 views
1

我使用的春天啓動,並有@EnableJms啓動和停止@JmsListener

如果我只用註釋@JmsListener(destination = "xxxxxx")並且依賴於春天開機自動配置,我怎麼能啓動和停止jmslistener知道我將其設置爲自動 - 啓動假

jms: 
    listener: 
     max-concurrency: 10 
     concurrency: 1 
     auto-startup: false 

的問題是,我怎麼能訪問SimpleMessageListenerContainerDefaultMessageListenerContainer

回答

2

this answer - 單個集裝箱可訪問通過註冊表,或者您也可以出演t /停止註冊表來啓動/停止它們。

編輯

這是一個錯誤,我開了一家JIRA Issue;一個解決辦法是在開始之前重置自動啓動...

@SpringBootApplication 
public class So36332914Application { 

    public static void main(String[] args) throws Exception { 
     ConfigurableApplicationContext context = SpringApplication.run(So36332914Application.class, args); 
     JmsTemplate template = context.getBean(JmsTemplate.class); 
     JmsListenerEndpointRegistry registry = context.getBean(JmsListenerEndpointRegistry.class); 
     System.out.println(registry.getListenerContainerIds().size() + " containers"); 
     System.out.println("Running: " + registry.isRunning()); 

     // https://jira.spring.io/browse/SPR-14105 
     for (MessageListenerContainer container : registry.getListenerContainers()) { 
      ((AbstractJmsListeningContainer) container).setAutoStartup(true); 
     } 
     registry.start(); 
     System.out.println("Running: " + registry.isRunning()); 
     template.convertAndSend("foo", "bar"); 
     registry.stop(); 
     System.out.println("Running: " + registry.isRunning()); 
     context.getBean(Foo.class).latch.await(10, TimeUnit.SECONDS); 
     context.close(); 
    } 

    @Bean 
    public Foo foo() { 
     return new Foo(); 
    } 

    public static class Foo { 

     private final CountDownLatch latch = new CountDownLatch(1); 

     @JmsListener(destination="foo") 
     public void foo(String foo) { 
      System.out.println(foo); 
      latch.countDown(); 
     } 

    } 

} 
+0

基於上述答案,如果我停止/啓動它是完美的工作。但如果我把屬性文件中的自動啓動設置爲false,然後在初始化後嘗試啓動它,它不會啓動,任何想法 – Shahbour

+0

看起來像一個錯誤;我打開了一個JIRA問題 - 請參閱我的編輯解決方法。 –

+0

感謝您的更新,我做了循環,直接在容器上啓動,但修復了自動啓動更乾淨 – Shahbour