12.6. 分離モードでの HTTP トランスポートの使用
概要
通常の HTTP 要求/応答シナリオでは、要求と応答は同じ HTTP 接続を使用して送信されます。サービスプロバイダーは要求を処理し、適切な HTTP ステータスコードと応答の内容を含む応答で応答します。リクエストが成功した場合、HTTP ステータスコードは 200 に設定されます。
WS-RM を使用している場合や、要求の実行に長時間かかる場合など、場合によっては、要求メッセージと応答メッセージを分離することが理にかなっています。この場合、サービスプロバイダーは、要求が受信された HTTP 接続のバックチャネルを介して、202 Accepted 応答をコンシューマーに送信します。その後、リクエストを処理し、新しい分離された server→client HTTP 接続を使用して応答をコンシューマーに送信します。コンシューマーランタイムは着信応答を受信し、アプリケーションコードに戻る前に、それを適切な要求と関連付けます。
分離された対話の設定
分離モードで HTTP トランスポートを使用するには、次のことを行う必要があります。
WS-Addressing を使用するようにコンシューマーを設定します。
「WS-Addressing を使用するためのエンドポイントの設定」 を参照してください。
分離されたエンドポイントを使用するようにコンシューマーを設定します。
「コンシューマーの設定」 を参照してください。
WS-Addressing を使用するためにコンシューマーが対話するサービスプロバイダーを設定します。
「WS-Addressing を使用するためのエンドポイントの設定」 を参照してください。
WS-Addressing を使用するためのエンドポイントの設定
コンシューマーおよびコンシューマーが対話するサービスプロバイダーが WS-Addressing を使用することを指定します。
エンドポイントが WS-Addressing を使用するように指定するには、次の 2 つの方法のいずれかを使用します。
例12.19「WSDL を使用した WS-Addressing のアクティブ化」 に示すように、
wswa:UsingAddressing
要素をエンドポイントの WSDLport
要素に追加します。例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 トランスポートのメッセージフロー
リクエストは以下のプロセスを開始します。
- コンシューマーの実装は操作を呼び出し、リクエストメッセージが生成されます。
WS-Addressing レイヤーは WS-A ヘッダーをメッセージに追加します。
分離されたエンドポイントがコンシューマーの設定に指定されると、切り離されたエンドポイントのアドレスは WS-A ReplyTo ヘッダーに配置されます。
- メッセージはサービスプロバイダーに送信されます。
- サービスプロバイダーはメッセージを受信します。
- コンシューマーからの要求メッセージは、プロバイダーの WS-A レイヤーにディスパッチされます。
- WS-A ReplyTo ヘッダーは anonymous に設定されていないため、プロバイダーは HTTP ステータスコードが 202 に設定されたメッセージを返信し、リクエストが受信されたことを承認します。
- HTTP レイヤーは、元の接続のバックチャネルを使用して 202 Accepted メッセージをコンシューマーに送信します。
コンシューマーは、元のメッセージの送信に使用する HTTP 接続のバックチャネルで 202 Accepted 応答を受け取ります。
コンシューマーが 202 Accepted 応答を受け取ると、HTTP 接続を閉じます。
- 要求は、要求が処理されるサービスプロバイダーの実装に渡されます。
- 応答の準備ができると、WS-A 層にディスパッチされます。
- WS-A レイヤーは、WS-Addressing ヘッダーを応答メッセージに追加します。
- HTTP トランスポートは、コンシューマーの分離されたエンドポイントに応答を送信します。
- コンシューマーの分離されたエンドポイントは、サービスプロバイダーからの応答を受信します。
- レスポンスはコンシューマーの WS-A レイヤーにディスパッチされ、WS-A RelatesTo ヘッダーを使用して適切なリクエストに相関します。
- 相関応答がクライアント実装に返され、呼び出し呼び出しのブロックが解除されます。