我在Spring框架和我的問題是新低於:使用DefaultMessageListenerContainer問題關機程序
我想實例化DefaultMessageListenerContainer
編程,而我使用的代碼是:
DefaultMessageListenerContainer container = new DefaultMessageListenerContainer();
container.setConnectionFactory(cf);
container.setDestination(Queue);
container.setMessageListener(Consumer);
container.setReceiveTimeout(-1);
container.setMaxConcurrentConsumers(15);
container.setConcurrentConsumers(10);
container.start();
爲什麼我有當我的項目被取消部署時手動關閉DefaultMessageListenerContainer
?如果我不手動關閉容器,則消費者會在我的隊列中保持打開狀態。
當我嘗試手動關閉容器(通過調用container.shutdown()
)時,過程出現問題並且項目無法繼續。 如果我初始化DefaultMessageListenerContainer
而不給receiveTimeout
關機程序執行正確。 setReceiveTimeout(-1)
有問題嗎?
謝謝您的回答!我想通過程序生成我的聽衆,因爲我想改變運行時的某些屬性。這些屬性是:併發使用者,每個隊列的最大併發使用者數,接收超時值。通過這種方式,我可以通過JMX提供我的屬性,並用新的值重新啓動監聽器。實例化偵聽器的類實現SmartLifecycle。因此,監聽器在啓動時初始化,並在項目解除部署時銷燬。問題是,當我在setReceiveTimeout方法中設置-1時,當偵聽器嘗試關閉時項目停滯了。 – pbal
查看此類的Spring文檔,我認爲您需要調用stop()來停止偵聽器,如doShutdown()只是似乎取消註冊JMS消費者,這可能會隨着消費者不斷接收(由於timeout = -1)而掛起。 – shuttsy
我試圖在doShutdown()之前阻止聽衆,但問題仍然存在。該項目在執行doShutDown()方法時發生。 – pbal