2008-10-24 128 views
6

我正在使用activemq在不同進程之間傳遞請求。在某些情況下,我在隊列中有多個重複的消息(它們是請求)。我想只有一個。有沒有辦法以一種方式發送消息,以便用相似的屬性替換舊消息?如果沒有,是否有辦法檢查隊列並檢查具有特定屬性的消息(在這種情況下,如果存在較舊的消息,則不會發送新消息)。 Clarrification(基於Dave的回答):我實際上試圖確保隊列中沒有任何重複消息,以減少消費者獲取消息時發生的處理量。因此,我希望要麼替換一條消息,要麼甚至不把它放在隊列中。替換jms隊列中的消息

謝謝。

回答

0

你可以瀏覽隊列中,並使用選擇識別消息。但是,除非有少量消息,否則這種消息不會很好地擴展。相反,您的消息應該只是一個指向數據庫記錄(或一組記錄)的指針。通過這種方式,您可以更新記錄,然後獲取該消息的人員將訪問該記錄的最新版本。

+0

謝謝戴夫。實際上,我試圖確保隊列中沒有任何重複消息,以減少消費者獲取消息時發生的處理量。因此,我希望要麼替換一條消息,要麼甚至不把它放在隊列中。 Udi – Udi 2008-10-24 20:08:39

2

這聽起來像一個理想的使用情況下,用於Idempotent Consumer其去除從隊列或話題重複。

下面的例子演示瞭如何做到這一點與Apache Camel這是實現任何Enterprise Integration Patterns的最簡單的方法,特別是如果你正在使用ActiveMQcomes with Camel integrated開箱

from("activemq:queueA"). 
    idempotentConsumer(memoryMessageIdRepository(200)). 
    header("myHeader"). 
    to("activemq:queueB"); 

唯一的技巧來此的是確保有來計算每個消息的唯一ID表達一個簡單的方法 - 諸如來自文檔拉出的XPath或使用如在上面的例子中一些獨特的消息報頭