我們正在開發將部署到WAS集羣的應用程序。該應用程序從多個JMS(Websphere MQ)隊列中消費消息,並將結果寫入單個數據庫。Websphere Application Server集羣和JMS消息消耗
但是,我們有一個要求,即在應用程序內深處,給定ID的所有消息一次處理一個。我們目前使用同步收集強制執行此操作,但這不適用於羣集。
那麼有沒有一種配置應用程序/集羣/激活規範來實現這一目標的方法?
我們正在開發將部署到WAS集羣的應用程序。該應用程序從多個JMS(Websphere MQ)隊列中消費消息,並將結果寫入單個數據庫。Websphere Application Server集羣和JMS消息消耗
但是,我們有一個要求,即在應用程序內深處,給定ID的所有消息一次處理一個。我們目前使用同步收集強制執行此操作,但這不適用於羣集。
那麼有沒有一種配置應用程序/集羣/激活規範來實現這一目標的方法?
首先要認識到的是,應用程序的設計必須消除消息的親和性才能水平擴展。對於克服應用程序的設計限制,可以預期消息傳輸有多少限制。根據消息有效載荷內容改變消息傳遞路線,順序或目的地的處理對於ESB而不是傳輸而言是正確的作業。最佳解決方案是使用適合水平縮放的體系結構重新設計應用程序。
也就是說,一種方法是使用消息組。尋找新組的應用程序實例應忽略其中JMSXGroupID
不是1
的任何消息。發送消息的應用程序必須準備好相應地設置組ID和序列號。
完成此操作的另一種方法是通過攔截和發送。程序讀取主隊列以查找ID的新實例。當它看到一個新的ID時,它將該消息移動到一個單獨的調度隊列。使用中的應用程序實例都讀取調度隊列尋找工作。由於此隊列中的ID保證是唯一的,因此每個ID都分配給特定的應用程序實例。然後,應用程序使用要處理的ID的選擇器打開主隊列。生產者應用程序必須將ID設置爲消息屬性或在相關性ID字段中進行選擇,但不需要管理組。
我可以告訴你和以前的響應者知道了很多關於這方面比我做的,但萬一這有助於...
我們有,我們要處理的只有一個請求的MDB因此我們將激活規範中的「最大併發端點」設置爲1.
因此,也許您可以對此特定ID使用不同的目標,或者讓初始目標的邏輯重新排列ID到第二個目的地?