2011-10-27 9 views
7

特定のグループ(グループIDが設定されている)に属するメッセージが同じBeanインスタンスによって消費されるように、JMSメッセージ(MDB経由)を処理する必要があります。私が必要とするのは、同じグループIDを持つメッセージは順番に処理されますが(メッセージの順序は関係ありません)、同じMDBインスタンスにそれらを結び付けることでそれを実現する必要があります。WebSphere MQのメッセージグループ

メッセージには何らかの種類のシーケンス番号が含まれていません(関連性がないため)。グループ内の最初のメッセージまたは最後のメッセージが何であるかわかりません(グループ内の最後のメッセージは論理的に「決して」ありません) 。私たちは、消費者がそれらを受け取ることができるようになるとすぐにそれらを届けたい。

ActiveMQは、JMSXGroupIDを設定するだけで、この正確な機能(http://activemq.apache.org/message-groups.html)を提供します。しかし、私たちはWebSphere MQに縛られています。私が今までに知ったのは、キュー内の同じグループのメッセージを収集し、http://www.ibm.com/developerworks/websphere/library/techarticles/0602_currie/0602_currie.htmlで説明されているようにMessageSelectorを使用して「グループ内の最後のメッセージ」メッセージを受信することが可能であることです。 ActiveMQのように、よりクリーンな方法を好むだろう。誰もがWebSphereでその動作を達成する方法を知っていますか?

ありがとうございます!

答えて

2

一般的に、JMSのIBM製品実装(WebSphere MQとSIBusの両方の実装)でMessageSelectorを使用します。これらは、WebベースのプロトコルのHTTPまたはSOAPメッセージのヘッダーをスキャンするフィルタと同等です。

あなたが望むものではないかもしれませんが、実際にはクリーンでよく考えられたデザインです。

ただし、MessageSelectorを使用したくない場合は、独自のメッセージを作成し、ヘッダーをスキャンしてメッセージを適切なキューに転送する前向きのMDBを使用してメッセージを「処理」する必要がありますグループ化されたメッセージを気にするMDBがそれらを処理します(ゲートウェイ/メッセージセレクタパターンのようなもの)。

"純粋な" JMS APIを使用している場合は、フィルタリングする指定されたセレクタ文字列(ヘッダーの値)を持つMessageConsumerを作成するようSessionオブジェクトに依頼できます(これも自分で設定する必要があります) )。

//assume we have created a JMS Connection and Session object already. 
//and looked up the Queue we want already. 
MessageConsumer consumerWithSelector = session.createConsumer(queue, groupId); 

これはすべて純粋なJMS APIから得られるものです。それ以外のものは、メッセージング技術の実装者に委ねられています。その実装はポータブルコードではなく独自の実装です。

+0

ありがとう、それは私が期待したものです。 – ftr

関連する問題