WS-Reliable Messaging

メッセージ・フローは、WS-Reliable Messaging が有効にされていない状態でインポートされます。 SOAP over HTTP による TCP/IP モニターの場合と同様に、誰でも Web サービスを呼び出してメッセージを取り込むことができます。 WS-Reliable Messaging を有効にするには、『Address Book サンプルの拡張』を参照してください。

WS-RM の有効化は、WebSphere Message Broker レベルで実行される管理用タスクです。 メッセージ・フローの開発中に WS-RM を構成することはできません。 ブローカー内のポリシーを構成し、それをブローカー・アーカイブ (BAR) ファイル内のメッセージ・フローと関連付ける必要があります。

WS-Reliable Messaging を使用する理由

Address Book 拡張サンプルでは、コンシューマーとプロバイダーの両方に、次のような同じ高信頼性メッセージング要件があります。

  1. サーバーが予期せずに再始動したときに、SOAP メッセージが必ず送達されること。
  2. タイムアウトなどのためにクライアントとサーバーの間の接続が失敗するときに、SOAP メッセージが必ず送達されること。 クライアントは、状況を検出してメッセージ伝送を再試行できるようでなければなりません。

WS-RM プロトコルは、正常に送達されなかったと判別したメッセージを再送信する方法を定義することにより、また宛先アプリケーションにメッセージが重複して送達されないようにすることにより、これらの要件を実現しています。

WS-Reliable Messaging の仕組み

WS-RM を理解するために重要なのは、シーケンスの概念です。 WS-RM におけるシーケンスは、Web サービス・クライアントと Web サービス・プロバイダーの間の契約のようなもので、それに基づいて両者は相互に信頼できる仕方でメッセージを伝送することに同意します。 シーケンスは、送受信されたメッセージの状態を維持するために使用されます。 シーケンス自体は、プロバイダーのエンドポイントに対して固有です。 クライアントが Web サービス・プロバイダーのエンドポイントに初めてメッセージを送信すると、そのプロバイダーのエンドポイントに対するシーケンスが作成され、同じクライアントから同じプロバイダーのエンドポイントに送られる以後すべてのメッセージはそのシーケンス上で送達されます。 シーケンスを使用することにより、クライアント・サイドおよびプロバイダー・サイドの WS-RM で、アプリケーション・メッセージを再び送達する必要があるかどうかを判断したり、着信メッセージが重複しているかどうかを検出したりできます。

シーケンスを定義して現在の状態を維持するために、クライアント側とプロバイダー側の WS-RM の両方で定義済みのプロトコル・メッセージのコレクションが使用され、このメッセージがやり取りされます。 次の図は、WS-RM を使用した要求/応答 Web サービス呼び出しの典型的なメッセージ・フローを示したものです。

以下のステップで説明されている典型的な WS-RM メッセージ交換シーケンス。

サンプルのシナリオ

WS-RM が有効である場合にサンプルがどのように動作するかを順番に説明します。

  1. プロトコル前提条件が確立されます。それには、ポリシーの交換、エンドポイントの解決、およびトラストの確立が含まれます。
  2. コンシューマーが新規シーケンスの作成を要求します。
  3. プロバイダーは新規シーケンスを作成して、その固有 ID を返します。
  4. コンシューマーは、MessageNumber 1 で始まるシーケンスでメッセージの送信を開始します。 SOAPRequest ノードによって送信される要求ごとに新規シーケンスが作成されるので、すべてのメッセージの MessageNumber が 1 になります。
  5. コンシューマーも AckRequested ヘッダーを組み込んで、このシーケンスに対する SequenceAcknowledgement をタイミング良く取得できるようにします。
  6. プロバイダーは、コンシューマーの AckRequested ヘッダーを受信した結果として、メッセージ番号 (MessageNumber) 1 の受信を応答します。 何らかの理由で両者間のメッセージが失われた場合は、コンシューマーへの確認応答は送信されません。
  7. コンシューマーは未応答のメッセージを同じ MessageNumber で再送信します。 これは基礎となるトランスポートから見れば新規のメッセージですが、Sequence Identifier (シーケンス ID) と MessageNumber が同じなので、元のメッセージと再送信されたメッセージの両方を受信した場合には、プロバイダーはこれを前のメッセージの重複として認識できます。 コンシューマーで再送信されたメッセージに AckRequested ヘッダーが組み込まれるので、プロバイダーは確認応答を迅速に行えます。
  8. プロバイダーは MessageNumber 1 のメッセージの 2 回目の送信を受信して、メッセージ番号 1 の受信を応答します。
  9. コンシューマーはこの確認応答を受信して、このシーケンスが完了したことを伝える TerminateSequence メッセージをプロバイダーに送信します。 この TerminateSequence メッセージは、メッセージ番号 1 がこのシーケンスの最後のメッセージであったことを示します。
  10. プロバイダーは、コンシューマーがそれ以上メッセージを送信しないことを示す TerminateSequence メッセージを受信します。 プロバイダーは TerminateSequenceResponse メッセージをコンシューマーに送信して、このシーケンスに関連付けられたリソースを再利用します。

メッセージを順番に送達するかどうかについての詳細は、WS-RM ポリシー・セットに含まれています。 前の図も参照してください。

「Address Book サンプルの拡張」に戻る

サンプルのホームに戻る