2016-11-24 64 views
0

Spring提供@JMSListener註釋以偵聽來自特定隊列的消息。還有一個替代implement JmsListenerConfigurer並註冊MessageListenerSpring JMS開始根據請求偵聽jms隊列

在這兩種情況下,在應用程序啓動時必須知道隊列的名稱,無論是通過代碼中的硬編碼還是通過屬性。

有沒有一種方法可以在應用程序啓動之後的很長時間內偵聽其名稱已知的隊列?

回答

1

這應該工作。

  1. 使用虛擬隊列名稱和id配置@JmsListener
  2. listener container factoryautoStartup配置爲false。
  3. 準備就緒後,使用從JmsListenerEndpointRegistry(將註冊表自動連接到應用程序並調用getListenerContainer(id))中的id獲得對偵聽器容器的引用。
  4. 將容器投入到AbstractMessageListenerContainer,並用所需的隊列呼叫setDestinationName(或setDestination)。
  5. start()它。
+1

如果您希望動態創建大量容器,那麼只需以編程方式創建容器,調用'afterPropertiesSet()',然後調用'start()'。 –

+0

非常感謝!我會嘗試這個並更新。如果碰巧有多個請求隊列偵聽器,您是否會知道與偵聽器對象相比容器有多沉重? – Sundeep

+0

我不確定你的意思;每個'@ JmsListener'運行在由工廠創建的'DefaultMessageListenerContainer'中。它實際上與以編程方式創建容器並將POJO偵聽器封裝在'MessageListenerAdapter'中相同。 –