Menu Close

第43章 ハンドラーの作成

概要

JAX-WS は、メッセージ処理モジュールをアプリケーションに追加する柔軟なプラグインフレームワークを提供します。このようなモジュール (ハンドラーとも呼ばれる) はアプリケーションレベルのコードから独立しており、低レベルのメッセージ処理機能を提供できます。

43.1. ハンドラー: はじめに

概要

サービスプロキシーがサービスで操作を呼び出すと、操作のパラメーターは Apache CXF に渡されます。そこでパラメーターはメッセージに組み込まれ、ワイヤ上に配置されます。サービスがメッセージを受信すると、Apache CXF はワイヤからメッセージを読み取り、メッセージを再構築し、操作のパラメーターを操作を実装するアプリケーションコードに渡します。アプリケーションコードがリクエストの処理が完了すると、応答メッセージはリクエスト元のサービスプロキシーへの移動時に同様のイベントチェーンを経ます。これは 図43.1「メッセージ交換パス」に示されています。

図43.1 メッセージ交換パス

message exchange path between a client and a server

JAX-WS は、アプリケーションレベルのコードとネットワーク間のメッセージデータを操作するためのメカニズムを定義します。たとえば、オープンネットワーク経由で渡されたメッセージデータを、プロプライエタリーの暗号化メカニズムを使用して暗号化したい場合があります。データを暗号化および復号化した JAX-WS ハンドラーを作成できます。その後、ハンドラーをすべてのクライアントおよびサーバーのメッセージ処理チェーンに挿入できます。

図43.2「ハンドラーを使ったメッセージ交換パス」に示すように、ハンドラーは、アプリケーションレベルのコードとメッセージをネットワークに配置するトランスポートコードの間をトラバースするチェーン内に配置されます。

図43.2 ハンドラーを使ったメッセージ交換パス

handlers are placed on the message exchange path between the transport and the application layers

ハンドラー型

JAX-WS 仕様は、2 つの基本ハンドラー型を定義します。

  • 論理ハンドラー 論理ハンドラーは、メッセージペイロードとメッセージコンテキストに保存されたプロパティーを処理できます。たとえば、アプリケーションが純粋な XML メッセージを使用する場合、論理ハンドラーはメッセージ全体にアクセスできます。アプリケーションが SOAP メッセージを使用する場合、論理ハンドラーは SOAP ボディーの内容にアクセスできます。メッセージコンテキストに置かれない限り、SOAP ヘッダーまたはいずれのアタッチメントにもアクセスできません。

    論理ハンドラーは、ハンドラーチェーンのアプリケーションコードの最も近くに配置されます。つまり、メッセージがアプリケーションコードからトランスポートに渡されるときに最初に実行されます。メッセージがネットワークから受信されてアプリケーションコードに渡して戻されると、論理ハンドラーは最後に実行されます。

  • プロトコルハンドラー プロトコルハンドラーは、ネットワークから受信したメッセージ全体と、メッセージコンテキストに保存されたプロパティーを処理できます。たとえば、アプリケーションが SOAP メッセージを使用する場合、プロトコルハンドラーは SOAP ボディーの内容、SOAP ヘッダー、およびアタッチメントにアクセスできます。

    プロトコルハンドラーは、ハンドラーチェーンのトランスポートの最も近くに配置されます。つまり、メッセージがネットワークから受信されるときに最初に実行されます。メッセージがアプリケーションコードからネットワークに送信されると、プロトコルハンドラーは最後に実行されます。

    注記

    Apache CXF によってサポートされる唯一のプロトコルハンドラーは SOAP に固有のものです。

ハンドラーの実装

2 つのハンドラー型の違いはほとんど無く、共通のベースインターフェースを共有します。共通の親子関係のため、論理ハンドラーとプロトコルハンドラーは、実装する必要がある多くのメソッドを共有します。これには、以下が含まれます。

  • handleMessage(): handleMessage() メソッドは、すべてのハンドラーの中心的なメソッドです。通常のメッセージを処理するメソッドです。
  • handleFault(): handleFault() は、障害メッセージを処理するメソッドです。
  • close(): メッセージがチェーンの最後に到達すると、ハンドラーチェーンのすべての実行済みハンドラーで close() が呼び出されます。これは、メッセージの処理中に消費されたリソースをクリーンアップするために使用されます。

論理ハンドラーの実装とプロトコルハンドラーの実装の違いは、以下の点を中心に展開されます。

  • 実装される特定のインターフェース

    すべてのハンドラーは、Handlerインターフェースから派生するインターフェースを実装します。論理ハンドラーは LogicalHandler インターフェースを実装します。プロトコルハンドラーは、Handler インターフェースのプロトコル固有の拡張を実装します。たとえば、SOAP ハンドラーは SOAPHandler インターフェースを実装します。

  • ハンドラーが利用できる情報の量

    プロトコルハンドラーは、メッセージの内容や、メッセージコンテンツにパッケージ化されたプロトコル固有の情報すべてにアクセスできます。論理ハンドラーは、メッセージの内容にのみアクセスできます。論理ハンドラーは、プロトコルの詳細を認識しません。

ハンドラーのアプリケーションへの追加

ハンドラーをアプリケーションに追加するには、以下を行う必要があります。

  1. ハンドラーがサービスプロバイダー、コンシューマー、またはその両方で使用されるかどうかを判断します。
  2. ジョブにもっとも適したハンドラーの型を決定します。
  3. 適切なインターフェースを実装します。

    論理ハンドラーの実装については、「論理ハンドラーの実装」を参照してください。

    プロトコルハンドラーの実装については、「プロトコルハンドラーの実装」を参照してください。

  4. ハンドラーを使用するようにエンドポイントを設定します。「ハンドラーを使用するエンドポイントの設定」を参照してください。