Menu Close

42.3. コンシューマー実装でのコンテキストの操作

概要

コンシューマー実装は、BindingProvider インターフェースを介してコンテキスト情報にアクセスできます。BindingProvider インスタンスは、2 つの個別のコンテキストでコンテキスト情報を保持します。

  • リクエストコンテキスト リクエストコンテキスト を使用すると、アウトバウンドメッセージに影響するプロパティーを設定できます。リクエストコンテキストプロパティーは特定のポートインスタンスに適用され、設定されると、プロパティーが明示的にクリアされるまで、ポートで実行された後続の操作の呼び出しすべてに影響します。たとえば、リクエストコンテキストプロパティーを使用して接続タイムアウトを設定したり、ヘッダーで送信するためにデータを初期化したりできます。
  • 応答コンテキスト 応答コンテキスト を使用すると、現在のスレッドから行われた最後の操作の呼び出しに対する応答によって設定されたプロパティー値を読み取ることができます。応答コンテキストプロパティーは、各操作の呼び出しの後にリセットされます。たとえば、最後のインバウンドメッセージから受信したヘッダー情報を読み取るために、応答コンテキストプロパティーにアクセスできます。
重要

メッセージコンテキストのアプリケーションスコープに置かれる情報のみが、コンシューマー実装からアクセスできます。

コンテキストの取得

コンテキストは、javax.xml.ws.BindingProvider インターフェースを使用して取得します。BindingProvider インターフェースには、コンテキストの取得に関して 2 つのメソッドあります。

  • getRequestContext(): 例42.7「getRequestContext() メソッド」に示されている getRequestContext() メソッドは、リクエストコンテキストを Map オブジェクトとして返します。返される Map オブジェクトを使用して、コンテキストの内容を直接操作できます。

    例42.7 getRequestContext() メソッド

    Map<String, Object>getRequestContext

  • getResponseContext(): 例42.8「getResponseContext() メソッド」に示されている getResponseContext() は、応答コンテキストを Map オブジェクトとして返します。返される Map オブジェクトの内容は、現在のスレッドで行われたモートサービスで最後に成功したリクエストからの応答コンテキストの内容の状態を反映しています。

    例42.8 getResponseContext() メソッド

    Map<String, Object>getResponseContext

プロキシーオブジェクトは BindingProvider インターフェースを実装するため、プロキシーオブジェクトをキャストすることで BindingProvider オブジェクトを取得できます。BindingProvider オブジェクトから取得したコンテキストは、作成に使用されたプロキシーオブジェクトで呼び出される操作にのみ有効です。

例42.9「コンシューマーのリクエストコンテキストの取得」に、プロキシーのリクエストコンテキストを取得するためのコードを示します。

例42.9 コンシューマーのリクエストコンテキストの取得

// Proxy widgetProxy obtained previously
BindingProvider bp = (BindingProvider)widgetProxy;
Map<String, Object> requestContext = bp.getRequestContext();

コンテキストからのプロパティーの読み取り

コンシューマーコンテキストは java.util.Map<String, Object> オブジェクトに保存されます。マップは、String オブジェクトであるキーと任意のオブジェクトが含まれる値を持ちます。応答コンテキストプロパティーのマッピングにあるエントリーにアクセスするには、java.util.Map.get() を使用します。

特定のコンテキストプロパティー ContextPropertyName を取得するには、例42.10「レスポンスコンテキストプロパティーの読み取り」に示されるコードを使用します。

例42.10 レスポンスコンテキストプロパティーの読み取り

// Invoke an operation.
port.SomeOperation();

// Read response context property.
java.util.Map<String, Object> responseContext =
  ((javax.xml.ws.BindingProvider)port).getResponseContext();
PropertyType propValue = (PropertyType) responseContext.get(ContextPropertyName);

コンテキストでのプロパティーの設定

コンシューマーコンテキストは、java.util.Map<String, Object> オブジェクトに保存されるハッシュマップです。マップには、String オブジェクトであるキーと任意のオブジェクトである値が含まれます。コンテキストのプロパティーを設定するには、java.util.Map.put() メソッドを使用します。

プロパティーをリクエストコンテキストと応答コンテキストの両方で設定できますが、リクエストコンテキストに加えた変更のみがメッセージ処理に影響します。応答コンテキストのプロパティーは、現在のスレッドで各リモート呼び出しが完了するとリセットされます。

例42.11「リクエストコンテキストプロパティーの設定」に記載されているコードは、BindingProvider.ENDPOINT_ADDRESS_PROPERTY の値を設定して、ターゲットサービスプロバイダーのアドレスを変更します。

例42.11 リクエストコンテキストプロパティーの設定

// Set request context property.
java.util.Map<String, Object> requestContext =
     ((javax.xml.ws.BindingProvider)port).getRequestContext();
requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://localhost:8080/widgets");

// Invoke an operation.
port.SomeOperation();
重要

リクエストコンテキストでプロパティーが設定されると、後続のすべてのリモート呼び出しにその値が使用されます。値を変更すると、変更された値が使用されます。

サポートされるコンテキスト

Apache CXF は、コンシューマー実装で以下のコンテキストプロパティーをサポートします。

表42.2 コンシューマーコンテキストプロパティー

プロパティー名説明

javax.xml.ws.BindingProvider

ENDPOINT_ADDRESS_PROPERTY

ターゲットサービスのアドレスを指定します。この値は String として保存されます。

USERNAME_PROPERTY[a]

HTTP Basic 認証に使用されるユーザー名を指定します。この値は String として保存されます。

PASSWORD_PROPERTY[b]

HTTP Basic 認証に使用されるパスワードを指定します。この値は String として保存されます。

SESSION_MAINTAIN_PROPERTY[c]

クライアントがセッション情報を維持するかどうかを指定します。この値は Boolean オブジェクトとして保存されます。

org.apache.cxf.ws.addressing.JAXWSAConstants

CLIENT_ADDRESSING_PROPERTIES

希望するサービスプロバイダーと通信するためにコンシューマーによって使用される WS-Addressing 情報を指定します。この値は org.apache.cxf.ws.addressing.AddressingProperties として保存されます。

org.apache.cxf.transports.jms.context.JMSConstants

JMS_CLIENT_REQUEST_HEADERS

メッセージの JMS ヘッダーを含めます。詳細は、「JMS メッセージプロパティーの操作」を参照してください。

[a] このプロパティーは、HTTP セキュリティー設定で定義されたユーザー名によって上書きされます。
[b] このプロパティーは、HTTP セキュリティー設定で定義されたパスワードによって上書きされます。
[c] Apache CXF はこのプロパティーを無視します。