2010-04-13 54 views
0

我使用一個消息監聽器,以處理從MQ基於Spring的使用DefaultMessageListenerContainer一些消息的處理。收到消息後,我必須進行Web服務(WS)調用。但是,我不想在onMessage方法中這樣做,因爲它會阻止onMessage方法,直到WS的調用成功爲止,並且這會引起隊列中消息的出隊等待時間。如何通過在onMesage方法外部調用它,或者不影響消息出隊,來解耦Web服務的調用?Spring的JMS設計問題:去耦消息

感謝,

回答

1

我想你可能真的想從你的onMessage調用Web服務。爲什麼你想快速出隊消息,然後延遲進一步處理?如果你按照自己的意思行事,那麼你可能不得不引入另一層次的排隊,或者某種暫時的「持有」收集,這是多餘的。隊列的要點是保存消息,並且消息監聽器會將它們拉出並儘快處理它們。

如果你正在尋找一種方式來最大限度地提高隊列吞吐量,你可能會想使它多線程,讓你有多個線程拉關閉消息隊列來調用Web服務。您可以通過在DefaultMessageListenerContainer上設置「concurrentConsumers」配置來輕鬆完成此操作。如果將concurrentConsumers設置爲5,則會有5個線程將​​消息從隊列中拉出來處理。如果你必須維護消息的順序,確實會變得棘手,但如果是這種情況,那麼可能會有解決方案。

0

我同意我之前提供的答案,但我可以看到在實踐中類似這樣很常見的用例。我添加了兩美分這可能是有效的,你不想在onMessage Thread(這是從Q拉消息)耗時的工作

我們在一個工作流中有類似的地方,其中如果用戶選擇的是指我們需要連接到另一個外部Web服務在這種情況下,我們不撥打電話到的onMessage線程web服務,並使用線程池來調度和處理這一呼籲得到ABCD服務器上的GUI一些XYZ選項。

如果Web服務調用過程中出現不我們播出到GUI作爲單獨的消息,則是橫跨信息保存下來,使GUI可以與錯誤信息請求ID的概念。您可以使用ExecutorService實現來提交任務。

希望它幫助。