Menu Close

12.6. 分離モードでの HTTP トランスポートの使用

概要

通常の HTTP リクエスト/応答シナリオでは、リクエストと応答は同じ HTTP コネクションを使用して送信されます。サービスプロバイダーはリクエストを処理し、適切な HTTP ステータスコードおよび応答の内容が含まれるレスポンスで応答します。リクエストが正常に行われると、HTTP ステータスコードは 200 に設定されます。

WS-RM を使用する場合やリクエストの実行に長時間かかる場合など、場合によっては、リクエストとレスポンスメッセージを切り離すのが妥当です。この場合、サービスプロバイダーはリクエストが受信された HTTP コネクションのバックチャネルを通じてコンシューマーに 202 Accepted 応答を送信します。次に、リクエストを処理し、新しい分離サーバー→クライアント HTTP コネクションを使用してレスポンスをコンシューマに送り返します。コンシューマーのランタイムは、受信応答を受け取り、アプリケーションコードに戻る前にこれを適切なリクエストと関連付けます。

分離された対話の設定

分離モードで HTTP トランスポートを使用するには、以下を行う必要があります。

  1. WS-Addressing を使用するようにコンシューマーを設定します。

    「WS-Addressing を使用するようにエンドポイントを設定」 を参照してください。

  2. 分離されたエンドポイントを使用するようにコンシューマーを設定します。

    「コンシューマーの設定」 を参照してください。

  3. WS-Addressing を使用するように、コンシューマーが対話するサービスプロバイダーを設定します。

    「WS-Addressing を使用するようにエンドポイントを設定」 を参照してください。

WS-Addressing を使用するようにエンドポイントを設定

コンシューマーとコンシューマーが対話するサービスプロバイダーが WS-Addressing を使用するように指定します。

エンドポイントが WS-Addressing を使用するように指定するには、以下の 2 つの方法の 1 つを使用します。

  • 例12.19「WSDL を使用した WS-Addressing のアクティブ化」 のように、エンドポイントの WSDL port 要素に wswa:UsingAddressing 要素を追加します。

    例12.19 WSDL を使用した WS-Addressing のアクティブ化

    ...
    <service name="WidgetSOAPService">
      <port name="WidgetSOAPPort" binding="tns:WidgetSOAPBinding">
        <soap:address="http://widgetvendor.net/widgetSeller" />
        <wswa:UsingAddressing xmlns:wswa="http://www.w3.org/2005/02/addressing/wsdl"/>
      </port>
    </service>
    ...
  • 例12.20「ポリシー使用した WS-Addressing のアクティブ化」 のように、WS-Addressing ポリシーをエンドポイントの WSDL port 要素に追加します。

    例12.20 ポリシー使用した WS-Addressing のアクティブ化

    ...
    <service name="WidgetSOAPService">
      <port name="WidgetSOAPPort" binding="tns:WidgetSOAPBinding">
        <soap:address="http://widgetvendor.net/widgetSeller" />
        <wsp:Policy xmlns:wsp="http://www.w3.org/2006/07/ws-policy"> <wsam:Addressing xmlns:wsam="http://www.w3.org/2007/02/addressing/metadata"> <wsp:Policy/> </wsam:Addressing> </wsp:Policy>
      </port>
    </service>
    ...
注記

WS-Addressing ポリシーは wswa:UsingAddressing WSDL 要素よりも優先されます。

コンシューマーの設定

http-conf:conduit 要素の DecoupledEndpoint 属性を使用して、分離されたエンドポイントを使用するようにコンシューマエンドポイントを設定します。

例12.21「分離された HTTP エンドポイントを使用するようにコンシューマを設定」 は、分離されたエンドポイントを使用するために 例12.19「WSDL を使用した WS-Addressing のアクティブ化」 に定義されるエンドポイントの設定を示しています。コンシューマーは http://widgetvendor.net/widgetSellerInbox ですべてのレスポンスを受け取るようになります。

例12.21 分離された HTTP エンドポイントを使用するようにコンシューマを設定

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:http="http://cxf.apache.org/transports/http/configuration"
       xsi:schemaLocation="http://cxf.apache.org/transports/http/configuration
                             http://cxf.apache.org/schemas/configuration/http-conf.xsd
                           http://www.springframework.org/schema/beans
                             http://www.springframework.org/schema/beans/spring-beans.xsd">

  <http:conduit name="{http://widgetvendor.net/services}WidgetSOAPPort.http-conduit">
    <http:client DecoupledEndpoint="http://widgetvendor.net:9999/decoupled_endpoint" />
  </http:conduit>
</beans>

メッセージの処理方法

分離モードで HTTP トランスポートを使用すると、HTTP メッセージの処理がより複雑になります。追加された複雑さはアプリケーションの実装レベルのコードに対して透過的ですが、デバッグの理由から何が起こるかを理解することが重要になる場合があります。

図12.1「分離された HTTP トランスポートのメッセージフロー」 は、分離モードで HTTP を使用する場合のメッセージのフローを示しています。

図12.1 分離された HTTP トランスポートのメッセージフロー

There are fifteen steps in a decoupled message exchange.

リクエストは、次のプロセスを開始します。

  1. コンシューマー実装は操作を呼び出して、リクエストメッセージが生成されます。
  2. WS-Addressing レイヤーは WS-A ヘッダーをメッセージに追加します。

    分離されたエンドポイントがコンシューマー設定に指定された場合、分離されたエンドポイントのアドレスは WS-A ReplyTo ヘッダーに配置されます。

  3. メッセージはサービスプロバイダーに送信されます。
  4. サービスプロバイダーはメッセージを受信します。
  5. コンシューマーからのリクエストメッセージはプロバイダーの WS-A レイヤーにディスパッチされます。
  6. WS-A ReplyTo ヘッダーは匿名に設定されていないため、プロバイダーは HTTP ステータスコードが 202 に設定されたメッセージを送り返し、リクエストが受信されたことを確認します。
  7. HTTP 層は、元のコネクションのバックチャネルを使用して 202 Accepted メッセージをコンシューマーに送り返します。
  8. コンシューマーは、元のメッセージを送信するために使用された HTTP コネクションのバックチャネルで 202 Accepted 応答を受信します。

    コンシューマーが 202 Accepted の返信を受信すると、HTTP コネクションが閉じます。

  9. リクエストは、リクエストが処理されるサービスプロバイダーの実装に渡されます。
  10. 応答の準備ができると、WS-A 層にディスパッチされます。
  11. WS-A 層は、応答メッセージに WS-Addressing ヘッダーを追加します。
  12. HTTP トランスポートは応答をコンシューマーの分離されたエンドポイントに送信します。
  13. コンシューマーの分離されたエンドポイントは、サービスプロバイダーから応答を受信します。
  14. レスポンスは、WS-A relateSto ヘッダーを使用して適切なリクエストと相関するコンシューマーの WS-A 層にディスパッチされます。
  15. 相関応答がクライアント実装に返され、呼び出しのブロックが解除されます。