第55章 Apache CXF Runtime のインターセプター
概要
Apache CXF ランタイムの機能のほとんどは、インターセプターで実装されます。Apache CXF ランタイムで作成されるすべてのエンドポイントには、メッセージ処理に候補として 3 つのインターセプターチェーンがあります。これらのチェーンのインターセプターは、ネットワーク全体で転送された生データと、エンドポイントの実装コードによって処理される Java オブジェクトの間でメッセージを変換します。インターセプターは、適切な順序で処理が行われるように複数の段階に分けて編成されます。
概要
Apache CXF 機能の大部分は、メッセージの処理を伴います。コンシューマーがリモートサービスで呼び出しを行う場合に、ランタイムはサービスが消費できるメッセージに、データをマーシャリングし、ネットワーク上に配置する必要があります。サービスプロバイダーは、メッセージをアンマーシャリングしてビジネスロジックを実行し、応答を適切なメッセージ形式でマーシャリングする必要があります。次に、コンシューマーは応答メッセージをアンマーシャリングし、適切なリクエストに関連付けて、コンシューマーのアプリケーションコードに戻す必要があります。Apache CXF ランタイムは、基本的なマーシャリングおよびアンマーシャリングの他に、メッセージデータでさまざまなことを実行できます。たとえば、WS-RM がアクティベートされると、ランタイムはメッセージをマーシャリングおよびアンマーシャリングする前に、メッセージチャンクや、確認メッセージを処理する必要があります。セキュリティーがアクティベートされると、ランタイムはメッセージ処理シーケンスの一部としてメッセージのクレデンシャルを検証する必要があります。
図55.1「Apache CXF インターセプターチェーン」 は、要求メッセージがサービスプロバイダーによって受信されるときにたどる基本的なパスを示しています。
図55.1 Apache CXF インターセプターチェーン
Apache CXF でのメッセージ処理
Apache CXF で開発されたコンシューマーがリモートサービスを呼び出すと、以下のメッセージ処理シーケンスが開始されます。
- Apache CXF ランタイムは、要求を処理するアウトバウンドインターセプターチェーンを作成します。
- 呼び出しが双方向のメッセージ交換を開始する場合、ランタイムはインバウンドインターセプターチェーンと障害処理インターセプターチェーンを作成します。
要求メッセージは、アウトバウンドインターセプターチェーンを介して順次渡されます。
チェーンの各インターセプターは、メッセージに処理を実行します。たとえば、Apache CXF が提供する SOAP インターセプターは、SOAP エンベロープでメッセージをパッケージ化します。
アウトバウンドチェーンのインターセプターのいずれかがエラー条件を作成すると、チェーンは巻き戻され、制御はアプリケーションコードに戻ります。
インターセプターチェーンは、以前に呼び出されたすべてのインターセプターで障害処理メソッドを呼び出すことで戻されます。
- リクエストが適切なサービスプロバイダーにディスパッチされます。
応答を受け取ると、インバウンドインターセプターチェーンを介して順次渡されます。
注記応答がエラーメッセージである場合には、障害処理インターセプターチェーンに渡されます。
- インバウンドチェーン上のインターセプターのいずれかがエラー条件を作成すると、チェーンは巻き戻されます。
- メッセージがインバウンドインターセプターチェーンの最後に到達すると、アプリケーションコードに戻ります。
Apache CXF で開発されたサービスプロバイダーがコンシューマーから要求を受信すると、同様のプロセスが実行されます。
- Apache CXF ランタイムは、インバウンドインターセプターチェーンを作成し、要求メッセージを処理します。
- 要求が双方向メッセージ交換の一部である場合には、ランタイムはアウトバウンドインターセプターチェーンと障害処理インターセプターチェーンも作成します。
- 要求はインバウンドインターセプターチェーンを介して順次渡されます。
インバウンドチェーンのインターセプターのいずれかがエラー条件を作成する場合に、チェーンは巻き戻され、障害はコンシューマーにディスパッチされます。
インターセプターチェーンは、以前に呼び出されたすべてのインターセプターで障害処理メソッドを呼び出すことで戻されます。
- 要求がインバウンドインターセプターチェーンの最後に到達すると、サービス実装に渡されます。
応答の準備ができると、アウトバウンドインターセプターチェーンを介して順次渡されます。
注記応答が例外である場合に、応答は障害処理インターセプターチェーンを介して渡されます。
- アウトバウンドチェーンのインターセプターのいずれかがエラー条件を作成する場合には、チェーンは巻き戻されて、障害メッセージがディスパッチされます。
- 要求がアウトバウンドチェーンの最後に到達すると、コンシューマーにディスパッチされます。
インターセプター
Apache CXF ランタイムのすべてのメッセージ処理は、インターセプター によって行われます。インターセプターとは、アプリケーション層に渡す前にメッセージデータにアクセスできる POJO です。メッセージの変換、メッセージのヘッダーの削除、メッセージデータの検証など、さまざまなことを実行できます。たとえば、インターセプターはメッセージのセキュリティーヘッダーを読み取り、外部セキュリティーサービスに対して認証情報を検証し、メッセージ処理を継続できるかどうかを決定できます。
インターセプターで使用できるメッセージデータは、複数の要因によって決定されます。
- インターセプターのチェーン
- インターセプターのフェーズ
- チェーンの初期に発生する他のインターセプター
フェーズ
インターセプターは フェーズ 別に編成されます。フェーズは、共通の機能を持つインターセプターの論理グループです。各フェーズは、特定のタイプのメッセージ処理を行います。たとえば、インターセプターがマーシャリングされた Java オブジェクトを処理して、アプリケーション層に渡すのは、同じフェーズで行われます。
インターセプターチェーン
フェーズは インターセプターチェーン に集約されます。インターセプターチェーンは、メッセージがインバウンドか、アウトバウンドであるかどうかに基づいて順序付けされるインターセプターフェーズのリストです。
Apache CXF を使用して作成された各エンドポイントには、3 つのインターセプターチェーンがあります。
- インバウンドメッセージのチェーン
- アウトバウンドメッセージのチェーン
- エラーメッセージのチェーン
インターセプターチェーンは、主にエンドポイントによって使用されるバインディングおよびトランスポートの選択に基づいて構築されます。セキュリティーやロギングなどの他のランタイム機能もチェーンに追加します。開発者は設定を使用して、カスタムインターセプターをチェーンに追加することもできます。
インターセプターの開発
機能に関係なくインターセプターを開発する場合は、常に同じ基本手順に従います。
Apache CXF は、カスタムインターセプターの開発を簡素化する抽象インターセプターを多数提供します。
インターセプターはメッセージの特定の部分が利用可能で、またデータを特定の形式で要求する必要があります。メッセージとデータの形式の内容は、インターセプターのフェーズによって部分的に決定されます。
通常、フェーズ内のインターセプターの順序は重要ではありません。ただし、特定の状況では、同じフェーズで他のインターセプターの前または後にインターセプターが実行されることが重要です。
- 「メッセージの処理」
インターセプターの実行後にアクティブなインターセプターチェーンでエラーが発生した場合に、その障害処理ロジックが呼び出されます。
- 59章インターセプターを使用するためのエンドポイントの設定