2011-03-15 136 views
2

我有被訂閱,它發送其內容最終被持久化到數據庫消息的主題的MDB。消息驅動Bean和消息的消費秩序

我知道MDB是合併的,因此容器能夠並行處理多個傳入消息。就我而言,在這些消息被消耗(並堅持)的順序是非常重要的。我不想一個MDB實例池以不同的順序消耗,然後堅持的消息,因爲他們得到了出版的JMS話題。

可這是一個問題?如果是這樣,有沒有告訴容器使用消息時要遵循嚴格的進貨訂單的一種方式?

回答

2

there:

複製到確保收到順序相匹配,其中客戶端發送消息的順序,必須做到以下幾點:

  • 設定最高豆式無池到1爲MDB。這確保了MDB是消息的唯一使用者。

  • 如果您的MDB部署在羣集上,請將它們部署到羣集中的單個節點[...]。

  • 要確保事務回滾和恢復時的消息排序,請將MessagesMaximum設置爲1的自定義連接工廠配置爲自定義連接工廠,並確保沒有配置重新傳遞延遲。欲瞭解更多信息,請參閱[...]。
2

您應該能夠將MDB池的大小限制爲1,從而確保以正確的順序處理消息。

當然,如果你仍然需要一些並行性,那麼你有幾個選項,但這取決於數據。

如果某些消息具有某些共同點,並且處理順序僅在該組消息中具有共同的值,那麼您可能需要擁有多個主題或使用隊列和線程池。

另一方面,如果與消息到達相關的邏輯的某些部分可以並行發生,而其他位不能,那麼您需要將邏輯分成並行 - 並行和並行不正確的部分,並相應地處理這些位。