0

JMS を使用して相互に通信する必要があるアプリケーションがいくつかあります。それらをサーバーとクライアントとして説明します。次の手順が実行されます。

  1. クライアントは、メッセージ ID を記憶しているサーバーに要求を送信します。
  2. サーバーは、指定された返信先アドレスに返信を送信します (また、要求のメッセージ ID に基づいて相関 ID を設定します)。
  3. クライアントは、相関 ID を使用して要求への応答を一致させました。

この2つだけなら大丈夫です。

(コンテンツ ベースの) ルーターを導入すると、次の手順が実行されます。

  1. クライアントは、メッセージ ID を記憶しているルーターに要求を送信します。
  2. ルーターはメッセージの内容をチェックし、メッセージをサーバーに転送します。(転送時はメッセージIDが変わります。)
  3. サーバーは、指定された返信先アドレスに返信を送信します (また、要求のメッセージ ID に基づいて相関 ID を設定します)。
  4. ルーターがメッセージ ID を変更したため、クライアントは要求に対する応答と一致しません。

JMS仕様に準拠しながら、ルーターを正しく実装する方法を一生理解することはできません。

私は次のことを考え出しましたが、これがベストプラクティスであるかどうかはわかりません:

  1. クライアントは、メッセージ ID を記憶しているルーターに要求を送信します。
  2. Router はメッセージの内容をチェックします。
  3. ルーターは元のメッセージを記憶し、新しいメッセージをサーバーに送信します (返信先アドレスをルーターの返信チャネルに設定します)。
  4. サーバーは、指定された返信先アドレスに返信を送信します (また、新しい要求のメッセージ ID に基づいて相関 ID を設定します)。
  5. Router は、Router が行った要求に対する応答を照合します。
  6. ルーターは、サーバーの応答に基づいて応答を作成し、相関 ID を元のメッセージのメッセージ ID に設定します。
  7. クライアントは、元の要求に対するルーターの応答を照合します。

JMS ルーターはどのように機能する必要がありますか? / 私の設計は正しいですか?

4

2 に答える 2

0

公式ドキュメントへの参照を含む可能性のある、より信頼できる回答を探していたので、さらに調査を行いました。これが私が見つけた最高のものです。

参照されているドキュメントには、次の2つのパターンが記述されています。

メッセージIDパターン

  1. クライアントはリクエストに返信先アドレスを設定し、それをサーバーに送信します。
  2. サーバーは要求のメッセージIDをコピーし、これを応答の相関IDとして設定し、要求の応答先アドレスに応答を送信します。

相関IDパターン

  1. クライアントはリクエストに相関IDを設定し、それをサーバーに送信します。
  2. サーバーは、要求の事前設定された相関IDを応答の相関IDとしてコピーし、事前定義されたキューに応答を送信します。

次の画像は、メッセージIDパターンを実装し、ルーターをプロキシとして実装するというアイデアを私に与えました。

メッセージIDパターンの例

つまり、私は最初のアイデアを採用しました。

出典:http ://docs.oracle.com/cd/E13171_01/alsb/docs25/interopjms/MsgIDPatternforJMS.html

于 2013-01-11T22:12:50.973 に答える
0

コンテンツ ベースのルーターを使用しているときに機能しない理由は、コンテンツ ベースのルーターが新しいメッセージ ID を持つ新しいメッセージ オブジェクトを作成していて、元のメッセージから相関 ID が設定されていないためです。


これが私が過去に行った方法です。次のキューがあるとします。

  • チャネル A - クライアントはここにリクエストを送信します
  • チャネル S - サーバーはここでリクエストを取得します

    1. クライアントはチャネル A に要求を送信し、クライアント固有の相関 ID を設定してキューに応答します
    2. ルーターは A でメッセージを消費し、相関 ID が設定され、キューへの応答が設定された S へのメッセージを作成します
    3. サーバーは、クライアント相関 ID を使用してキューへの応答に応答します

そのため、ルーターは応答メッセージの処理にまったく関与しないでください。ここで、このパターンを実装する際の一般的なエラーをいくつか紹介します。

  • サーバーは、生成する応答メッセージに相関 ID を設定しません。これは、最終的なコンシューマーがキューへの応答を見て、相関 ID を単に無視するためです。
  • メッセージ キューに設定ミスがあります
于 2013-01-08T05:21:06.283 に答える