Menu Close

第55章 Apache CXF ランタイムのインターセプター

概要

Apache CXF ランタイムの機能のほとんどは、インターセプターによって実装されます。Apache CXF ランタイムによって作成されたすべてのエンドポイントには、メッセージを処理するための 3 つの潜在的なインターセプターチェーンがあります。これらのチェーンのインターセプターは、ネットワーク全体で転送される raw データと、エンドポイントの実装コードによって処理される Java オブジェクトとの間のメッセージを変換します。インターセプターは、適切な順番で処理が行われるようにフェーズに編成されます。

概要

Apache CXF が行う機能の大部分は、メッセージの処理を伴います。コンシューマーがリモートサービスで呼び出しを行う場合、ランタイムはデータをサービスが消費できるメッセージにマーシャリングして、ネットワーク上に置く必要があります。サービスプロバイダーはメッセージをアンマーシャリングし、そのビジネスロジックを実行し、応答を適切なメッセージフォーマットにマーシャルする必要があります。その後、コンシューマーは応答メッセージをアンマーシャリングし、これを適切なリクエストに関連付け、コンシューマーのアプリケーションコードに返す必要があります。Apache CXF ランタイムは、基本的なマーシャリングおよびアンマーシャリングの他に、メッセージデータで他の多くの処理を行うことがあります。たとえば、WS-RM がアクティベートされている場合、ランタイムはメッセージをマーシャリングおよびアンマーシャリングする前にメッセージのチャンクおよび確認応答メッセージを処理する必要があります。セキュリティーがアクティベートされると、ランタイムはメッセージ処理シーケンスの一部としてメッセージのクレデンシャルを検証する必要があります。

図55.1「Apache CXF インターセプターチェーン」 は、サービスプロバイダーによって受信された時に要求メッセージが取る基本的なパスを示しています。

図55.1 Apache CXF インターセプターチェーン

depiction of an endpoint with in and out interceptor chains

Apache CXF でのメッセージ処理

Apache CXF で開発したコンシューマーがリモートサービスを呼び出すと、以下のメッセージ処理シーケンスが開始されます。

  1. Apache CXF ランタイムはアウトバウンドインターセプターチェーンを作成し、リクエストを処理します。
  2. 呼び出しが双方向メッセージエクスチェンジを開始する場合、ランタイムはインバウンドインターセプターチェーンおよび障害処理インターセプターチェーンを作成します。
  3. リクエストメッセージはアウトバウンドインターセプターチェーンを介して順次渡されます。

    チェーンの各インターセプターは、メッセージに対して何らかの処理を実行します。たとえば、Apache CXF が提供する SOAP インターセプターはメッセージを SOAP エンベロープにパッケージ化します。

  4. アウトバウンドチェーンのインターセプターのいずれかによってエラー条件が作成された場合、このチェーンはアンワインドされ、制御がアプリケーションレベルのコードに返されます。

    インターセプターチェーンは、以前呼び出されたすべてのインターセプターで障害処理メソッドを呼び出すことでアンワインドされます。

  5. リクエストは適切なサービスプロバイダーにディスパッチされます。
  6. 応答が受信されると、インバウンドインターセプターチェーンを介して順次渡されます。

    注記

    応答がエラーメッセージの場合、これは障害処理インターセプターチェーンに渡されます。

  7. インバウンドチェーンのインターセプターのいずれかがエラー条件を作成すると、チェーンはアンワインドされます。
  8. メッセージがインバウンドインターセプターチェーンの最後に到達すると、アプリケーションコードに戻されます。

Apache CXF で開発されたサービスプロバイダーがコンシューマーからリクエストを受信すると、同様のプロセスが実行されます。

  1. Apache CXF ランタイムはインバウンドインターセプターチェーンを作成し、リクエストメッセージを処理します。
  2. リクエストが双方向メッセージエクスチェンジの一部である場合、ランタイムはアウトバウンドインターセプターチェーンおよびト障害処理インターセプターチェーンも作成します。
  3. リクエストは、インバウンドインターセプターチェーンを介して順次渡されます。
  4. インバウンドチェーンのインターセプターがエラー条件を作成すると、チェーンはアンワインドされ、障害はコンシューマーにディスパッチされます。

    インターセプターチェーンは、以前呼び出されたすべてのインターセプターで障害処理メソッドを呼び出すことでアンワインドされます。

  5. リクエストがインバウンドインターセプターチェーンの最後に到達すると、サービス実装に渡されます。
  6. 応答の準備ができたら、アウトバウンドインターセプターチェーンを介して順次渡されます。

    注記

    応答が例外である場合は、障害処理インターセプターチェーンを介して渡されます。

  7. アウトバウンドチェーンのインターセプターがエラー条件を作成すると、チェーンはアンワインドされ、障害メッセージがディスパッチされます。
  8. リクエストがアウトバウンドチェーンの最後に到達すると、コンシューマーにディスパッチされます。

インターセプター

Apache CXF ランタイムのメッセージ処理はすべて インターセプター によって実行されます。インターセプターは、アプリケーションレイヤーに渡される前にメッセージデータにアクセスできる POJO です。これは、メッセージの変換、メッセージのヘッダーの削除、メッセージデータの検証など、さまざまな操作を行うことができます。たとえば、インターセプターは、メッセージからセキュリティーヘッダーを読み取り、外部セキュリティーサービスに対してクレデンシャルを検証し、メッセージ処理を続行できるかどうかを判断できます。

インターセプターに使用できるメッセージデータは、複数の要素によって決定されます。

  • インターセプターのチェーン
  • インターセプターのフェーズ
  • チェーンの早い段階で発生する他のインターセプター

フェーズ

インターセプターは フェーズ に編成されます。フェーズは、共通の機能を持つインターセプターの論理的なグループです。各フェーズは特定のタイプのメッセージ処理を担当します。たとえば、アプリケーション層に渡されるマーシャリングされた Java オブジェクトを処理するインターセプターは、すべて同じフェーズで発生します。

インターセプターチェーン

フェーズはインターセプターチェーンに集約されます。インターセプターチェーンは、メッセージがインバウンドまたはアウトバウンドであるかどうかに基づいて順序付けされるインターセプターフェーズのリストです。

Apache CXF を使用して作成された各エンドポイントには 3 つのインターセプターチェーンがあります。

  • インバウンドメッセージのチェーン
  • アウトバウンドメッセージのチェーン
  • エラーメッセージのチェーン

インターセプターチェーンは、主にエンドポイントによって使用されるバインディングおよびトランスポートの選択に基づいて構築されます。セキュリティーやロギングなどの他のランタイム機能を追加すると、チェーンにインターセプターが追加されます。開発者は、設定を使用してカスタムインターセプターをチェーンに追加することもできます。

インターセプターの開発

インターセプターの開発では、その機能に関係なく、常に同じ基本的な手順に従います。

  1. 56章インターセプター API

    Apache CXF は、カスタムインターセプターの開発を容易にするために多くの抽象インターセプターを提供します。

  2. 「インターセプターフェーズの指定」

    インターセプターでは、メッセージの特定の部分を利用できる必要があり、データを特定の形式で指定する必要があります。メッセージの内容とデータの形式は、インターセプターのフェーズによって部分的に決定されます。

  3. 「フェーズにおけるインターセプターの配置の制約」

    一般的に、フェーズ内のインターセプターの順序は重要ではありません。ただし、状況によっては、同じフェーズで他のインターセプターの前後にインターセプターが実行されるようにすることが重要になる場合があります。

  4. 「メッセージの処理」
  5. 「エラー後のアンワインド」

    インターセプターの実行後にアクティブなインターセプターチェーンでエラーが発生した場合、障害処理ロジックが呼び出されます。

  6. 59章インターセプターを使用するようエンドポイントを設定