2016-04-06 166 views
0

我知道JMS消息是不可變的。但是我有一個任務需要解決,這需要通過實體ID在隊列中重寫消息。也許系統設計有問題,請幫助我。JMS重寫消息

應用程序A向JMS發送消息(實體id = 1)。應用B每分鐘檢查一次新消息。

應用程序A可能會在一分鐘內發送許多帶有實體id = 1的消息,但應用程序B應該只看到最後一個消息。

這可能嗎?

  • 應用程序A應該儘可能快地工作,所以我不喜歡在新消息推送前執行removeMatchingMessages(String selector)的想法。

回答

0

IMO的方法是有缺陷的。

即使您確實接受通過使用消息選擇器在寫入新消息之前刪除實體id = 1的所有消息來清除隊列,定時會成爲一個問題:有可能無論哪個進程寫入過時的消息都會需要在寫入新消息之前完成某種程度的同步。

我能想到的另一個解決方案是在處理它們之前讀取所有消息。該線程每分鐘都會收到消息並將其加密。之前的實體id = 1消息將被後面的實體替換,以便在最後您擁有一組要處理的唯一消息。然後你處理它們。當然現在你可能會同時在內存中留下太多消息,並且事務性會被拋出窗口,但它可能會達到你想要的。

在這種情況下,您可能實際上是在讀取消息並將它們縮短後,並且每分鐘只運行一次處理邏輯。確保你同步你的水桶,使他們不會因爲你的新消息而被改變。

但總體而言,不知道它會上班