あなたの問題は、特定のソースから発信されたメッセージの順序付き配信を維持することですが、さまざまなソースからのメッセージを並行して処理することができるように思えます。
message groupsを使用してこれを行うことができます。
メッセージ・アプリケーションは、ブローカーを使用して、関連する一連のメッセージをグループに属するものとして分類することができます。これにより、メッセージ・プロデューサは、メッセージ・グループがアプリケーションに対して単一の論理操作とみなされるべきであることを消費者に示すことができる。 。
この仕事をするために、生産システム生産システム名にJMSXGroupIDヘッダを設定している:
Mesasge message = session.createTextMessage("<message />");
message.setStringProperty("JMSXGroupID", "SourceSystem1Name");
その後ブローカは、そのグループに属するメッセージの中で、消費順序付けを実施します。
補遺
それらが動的に を作成しているように、ソース・システムのN番号があるかもしれませんし、キュー
に これらのNソース・システムからのすべてのメッセージを置くプロデューサーがあります
したがって、メッセージプロデューサはJMSXGroupIDヘッダーをソースシステムの名前に設定できます。
私が直面してる問題は、一つのソースシステムのためのメッセージが が処理取得されている場合は、他のソースシステムメッセージが
だから、一度そのメッセージの処理の 完了まで待つ必要がありますグループヘッダーが記述されているように設定されている場合、ブローカーは指定されたソースシステムのメッセージをコンシューマーに順番にリリースするだけです。これは、グループ内の次のメッセージを解放する前に、前のメッセージが処理されたことを確認するように消費者に強制することによって行われます。
並行性を適切な値に設定することで、コンシューマはさまざまなソースシステムからのメッセージを並行して処理できますが、必要な動作である任意のソースシステムからのメッセージを順次処理することが強制されます。
JMSXGroupIDを設定することで、メッセージXをコンシューマが処理している(コンカレント= 1)メッセージを連続して処理するソースXが100%確実になることはありません。そして、その消費者が落ちるなら、それはすべてのメッセージを扱うもう1人です。私はそれがOPが望んでいるとは思わない。 –
@ruffp私の前提は、OPは注文された配送にのみ関係しているということです。私は彼がある消費者から別の消費者へのグループの親和性の切り替えを気にしないと思っています。特定のソースシステムからのメッセージだけが順番に処理されます。メッセージグループを使用することにより、ブローカはグループ内のメッセージが順番に配信されることを保証します。 –
@tom_redfern文章 'もし、異なるソースシステムのためのメッセージがある場合は、それらを並列に実行する必要があります。私は他のすべてのシステムを並行して扱わなければならないと考えさせてください。このグループでは、すべてのシステムインスタンスが順番に処理され、全体的に見て、すべてのシステムが並行して処理されます(例:すべてXはconsumer1に、Yはすべてconsumer2に、Zはすべてconsumer3になります)。 –