Tuxedo CORBA 要求レベルのインターセプタ

     前  次    新しいウィンドウで目次を開く     
ここから内容の開始

CORBA 要求レベルのインターセプタの概要

注意: Oracle Tuxedo CORBA Java クライアントと Oracle Tuxedo CORBA Java クライアント ORB は Tuxedo 8.1 で非推奨になり、今後はサポートされなくなりました。すべての Oracle Tuxedo CORBA Java クライアントおよび Oracle Tuxedo CORBA Java クライアント ORB のテキスト リファレンスとコード サンプルは、サード パーティ製の Java ORB ライブラリを実装または実行する際の参考や、プログラマの参照用としてのみ使用してください。
注意 : サード パーティの CORBA Java ORB のテクニカル サポートは、各ベンダによって提供されます。Oracle Tuxedo では、サード パーティの CORBA Java ORB に関する技術的なサポートやマニュアルは提供していません。

要求レベルのインターセプタとは、CORBA アプリケーションのクライアント コンポーネントとサーバ コンポーネントの間の呼び出しパスに、セキュリティ コンポーネントやモニタ コンポーネントなどの機能を挿入する手段となる、ユーザ記述の CORBA オブジェクトです。特定のマシン上でオブジェクト リクエスト ブローカ (ORB) にインストールおよび登録されたインターセプタは、そのマシン上のすべての CORBA アプリケーションに関与します。インターセプタを使用すると、任意の追加機能をクライアントサイド、サーバサイド、または両方でオブジェクト呼び出しの呼び出しパスに挿入できます。

要求レベルのインターセプタは通常、代表的な CORBA 環境の一部ではありません。これらの実装は、高度なプログラミング タスクと見なされています。

Oracle Tuxedo システムの CORBA 環境でサポートされるインターセプタは、2 種類のカテゴリに分類されます。

CORBA 環境の Oracle Tuxedo システムは、クライアント オブジェクトおよびターゲット オブジェクトの相対的な場所を基準として、インターセプタをインストールして使用できる場所に関する自由度は非常に高くなっています。クライアント アプリケーションからは、要求のターゲットが同じプロセス内にあるのか別のプロセス内にあるのかは、見えません。

クライアントサイド インターセプタとターゲットサイド インターセプタは別個のインタフェースから継承されていますが、両者を単一のソース ファイル内に実装すると都合のよい場合が多くあります。

 


インターセプタのアーキテクチャ

次の図は、要求レベルのインターセプタと Oracle Tuxedo システムの関係を示します。

ORB 上の複数のインターセプタ

CORBA インターセプタの Oracle Tuxedo 実装については、次の事項に留意してください。

ORB は、登録されたインターセプタのリストを維持します。インターセプタの登録は、管理タスクとして行う操作です。複数のインターセプタをインストールおよび作成できるので、アプリケーション実行時に、ORB はこのリストを使用して、いつ、どの順番でインターセプタを呼び出すべきかを決定します。複数のインターセプタを登録した場合、ORB は各インターセプタを連続的に実行します。複数のインターセプタの呼び出しの順序を設定するのも、管理タスクの 1 つです。

 


機能と制限事項

要求レベルのインターセプタは、以下のような数種類のサービス アプリケーションを実装する際に、特に有用です。

CORBA インターセプタに対する現在の制限事項は、以下のとおりです。

 


実行フロー

以下の節では、インターセプタを使用する CORBA アプリケーションの実行中に行われる処理を説明します。一般に、要求レベルのインターセプタのインスタンス化と初期化は、ORB の初期化時にのみ行われます。それ以外では、要求レベルのインターセプタをインスタンス化できません。

インターセプタの戻りステータスにより、ORB 実行時およびインストールされている可能性があるほかの要求レベルのインターセプタの実行フローが制御されます。

呼び出された後のインターセプタの戻りステータスに応じて、次のイベントのうち 1 つが発生することがあります。

複数の要求レベルのインターセプタを、1 回の呼び出しに関連付けることができます。あるインターセプタが別のインターセプタを認識する必要は、まったくありません。

呼び出しの要求応答サイクル内で起こるイベントは、次の 2 つのカテゴリに分けて提示されます。

クライアントサイドでの実行

呼び出しの要求応答サイクルにおいて、各インターセプタは 2 回呼び出されます。1 回目は要求がクライアントからターゲットに向かうとき、2 回目は応答がクライアントに返るときです。クライアントのインターセプタ クラス ClientRequestInterceptor には、これら 2 つの呼び出しに特に対応するオペレーションが 2 つあります。

クライアントサイド インターセプタを使用する CORBA アプリケーションの実行フローを図 1-1 に示します。この図では、基本的かつ正常な要求応答呼び出しサイクルを示します。つまり、このサイクルでは例外は発生しません。

図 1-1 クライアントサイド インターセプタ

クライアントサイド インターセプタ

図 1-1 では、以下のイベントを説明しています。

  1. 要求がクライアントから出され、ORB に到達します。
  2. ORB がクライアントサイド インターセプタの client_invoke オペレーションを呼び出します (「複数の要求レベルのインターセプタの使用方法」では、複数のクライアントサイド インターセプタがインストールされている場合に生じる現象について説明します)。
  3. クライアントサイド インターセプタは要求を処理し、ORB にステータス コードを返します。
  4. client_invoke オペレーションの結果として返される例外がない場合、要求はターゲット オブジェクトへのパスを再開します。
  5. ターゲット オブジェクトが要求を処理して、応答を発行します。
  6. 応答は ORB に戻され、ORB はインターセプタの client_response オペレーションを呼び出します。
  7. インターセプタが応答を処理し、ORB にステータス コードを返します。
  8. 応答がクライアント アプリケーションに送信されます。

クライアントサイドでの例外処理

client_invoke および client_response オペレーションは各々、クライアント インターセプタの処理を続行するかどうかを示すステータス値を返します。インターセプタは、例外処理を引き起こす例外ステータス値を返すことがあります。 表 1-1 は、これらのオペレーションから返されるステータス値に応じて生じる現象、およびインターセプタが ORB と共に例外を処理する方法を示します。

表 1-1 クライアント インターセプタの戻りステータス値
オペレーション
戻りステータス値
生じる現象
client_invoke()
INVOKE_NO_EXCEPTION
ORB はターゲットに送られた要求の通常処理を続行し、ほかにインターセプタが存在する場合は、それを呼び出します。
REPLY_NO_EXCEPTION
(Oracle Tuxedo 製品のバージョン 8.0 では、ORB はこの戻り値を処理できないため、これをインターセプタの戻り値として実装することは避けてください。)
インターセプタは要求を処理しました。ターゲットに対してこれ以上の処理は必要ありません。要求は、ターゲットによって処理された場合のように、処理済みと見なされます。したがって、ORB は呼び出しを短絡し、クライアント方向のインターセプタの呼び出しを開始します。同じインターセプタの client_response オペレーションは呼び出されませんが、それ以前に呼び出されたインターセプタの client_response オペレーションは呼び出されます。
REPLY_EXCEPTION
インターセプタは ORB へ例外を返します。次に、ORB はこれより前のクライアントサイド インターセプタの各 exception_occurred オペレーションを呼び出します。exception_occurred メソッドは、ORB がクライアント アプリケーションに例外を返す前に状態をクリーンアップする機会を、これより前のインターセプタに提供します。これにより、ORB は呼び出しを短絡し、呼び出しは完了します。exception_occurred メソッドの詳細については、「exception_occurred メソッド」を参照してください。
client_response()
RESPONSE_NO_EXCEPTION
ORB はクライアントに送られた要求の通常処理を続行し、ほかにインターセプタが存在する場合は、それを呼び出します。
RESPONSE_EXCEPTION
インターセプタは ORB に例外を返し、それ以前の要求の結果はすべてオーバーライドします。ORB は、クライアント方向に、それ以前の各インターセプタの exception_occurred メソッドを呼び出し、次にクライアント アプリケーションに例外を返します。

ターゲットサイドでの実行

クライアントサイドと同じく、ターゲットサイド インターセプタは要求応答サイクル中に 2 回呼び出されます。ターゲットサイド インターセプタは TargetRequestInterceptor クラスから継承されます。このクラスには、次のオペレーションが含まれます。

ターゲットサイド インターセプタを使用する CORBA アプリケーションの実行フローを図 1-2 に示します。この図では、基本的かつ正常な要求応答呼び出しサイクルを示します。つまり、このサイクルでは例外は発生しません。

図 1-2 ターゲットサイド インターセプタ

ターゲットサイド インターセプタ

図 1-2 では、以下のイベントを説明しています。

  1. クライアント要求が ORB に到達します。
  2. ORB がターゲットサイド インターセプタの target_invoke オペレーションを呼び出します (複数のターゲットサイド インターセプタがインストールされている場合に生じる現象については「複数の要求レベルのインターセプタの使用方法」の節で説明します)。
  3. ターゲットサイド インターセプタが要求を処理し、ORB にステータス コードを返します。
  4. target_invoke オペレーションの実行中に発生する例外がない場合、要求がターゲット オブジェクトへのパスを再開します。
  5. ターゲット オブジェクトが要求を処理して、応答を発行します。
  6. ターゲットサイド ORB がインターセプタの target_response オペレーションを呼び出します。
  7. インターセプタが応答を処理し、ORB にステータス コードを返します。
  8. 応答がクライアント アプリケーションに送信されます。

ターゲットサイドでの例外処理

表 1-2 は、target_invoke および target_response オペレーションによって返されるステータス値に応じて、ターゲットサイドの呼び出しに生じる現象を示し、例外が送出された場合の動作を説明します。

表 1-2 ターゲット インターセプタの戻りステータス値
オペレーション
戻りステータス値
生じる現象
target_invoke()
INVOKE_NO_EXCEPTION
ORB はターゲット (オブジェクト実装) への要求の通常処理を続行し、ほかにインターセプタが存在する場合は、それを呼び出します。
REPLY_NO_EXCEPTION
(Oracle Tuxedo 製品のバージョン 8.0 では、ORB はこの戻り値を処理できないため、これをインターセプタの戻り値として実装することは避けてください。)
インターセプタは要求を処理しました。ターゲットに対してこれ以上の処理は必要ありません。要求は、ターゲットによって処理された場合のように、処理済みと見なされます。したがって、ORB は呼び出しを短絡し、クライアント方向のインターセプタの呼び出しを開始します。同じインターセプタの target_response オペレーションは呼び出されませんが、それ以前に呼び出されたインターセプタの target_response オペレーションは呼び出されます。
REPLY_EXCEPTION
インターセプタは ORB へ例外を返します。次に、ORB はこれより前のターゲットサイド インターセプタの各 exception_occurred オペレーションを呼び出します。exception_occurred メソッドは、ORB がクライアント ORB に例外を返す前に状態をクリーンアップする機会を、これより前のインターセプタに提供します。これにより、ターゲット ORB は呼び出しを短絡し、呼び出しは完了します。exception_occurred メソッドの詳細については、「exception_occurred メソッド」を参照してください。
target_response()
RESPONSE_NO_EXCEPTION
ORB はクライアントに送られた要求の通常処理を続行し、ほかにインターセプタが存在する場合は、それを呼び出します。
RESPONSE_EXCEPTION
インターセプタは ORB に新しい例外を返し、それ以前の要求の結果はすべてオーバーライドします。クライアントに戻る過程でインターセプタの target_response オペレーションを呼び出す代わりに、ORB はこれらのインターセプタの exception_occurred オペレーションを呼び出します。

exception_occurred メソッド

すべてのインターセプタに exception_occurred メソッドが存在します。ORB はこのメソッドを、次の状況下で呼び出します。

前述の状況の 1 つが生じた場合、exception_occurred メソッドが client_response または target_response メソッドの代わりに呼び出されますが、クライアントの呼び出しを完了させる効果は本質的に同じです。

要求の追跡の詳細については、「インターセプタの応答オペレーションの実装」を参照してください。

短絡動作について

前述のように、インターセプタは自身で要求を処理したり、例外を返したりすることによって、クライアント要求を短絡できます。どちらの場合でも、クライアント要求が実際にターゲット オブジェクトによって処理されることはありません。

短絡動作は、client_invoke または target_invoke メソッドでのみ機能します。client_response または target_response メソッドには適用されません。

 


複数の要求レベルのインターセプタの使用方法

複数の要求レベルのインターセプタは、ORB が 1 つずつ逐次的に実行できるように、キューにインストールされます。ORB は、キューに残っている要求レベルのインターセプタがなくなるまで、各要求レベルのインターセプタに連続的に要求を供給します。すべてのインターセプタで正常な状態が示されると要求が処理されます。ORB は得られた応答をクライアントの場合はトランスポートに、ターゲットの場合はオブジェクト実装に送信します。ORB は要求の処理とは逆の順番で応答を処理するインターセプタを実行します。

インターセプタで正常な状態が示されない場合は、短絡応答が生じます。短絡は client_invoke または target_invoke オペレーションによって実行されます。インターセプタから返されたステータスにより、例外を伴う要求をターゲット オブジェクトに処理させるのではなく、インターセプタ自体で応答することが、ORB に通知されます (インターセプタの client_response または target_response オペレーションでは、短絡動作を行うことはできませんが、ターゲット応答の代わりとなることはできます)。

各インターセプタは通常、明示的に情報を共有していない限り、ほかのインターセプタを認識していません。この独立したプログラミング モデルは、短絡に関する実行セマンティクスによって維持されます。応答を短絡して、送信先 (クライアントサイドのトランスポート、およびターゲットサイドのオブジェクト実装) に届かないようにする必要があるとインターセプタが示した場合、応答は正常に通過したインターセプタを経由して元に戻ります。たとえば、インターセプタ A が client_invoke オペレーションの処理後に、要求が送信されるようにステータス値 INVOKE_NO_EXCEPTION を返し、次のインターセプタ B が要求を拒否して例外を生成すると、その例外は応答に加えられ、インターセプタ A の exception_occurred オペレーションに送信されます。ターゲットサイドの類似の実行モデルも有効です。

図 1-3 は複数のクライアントサイド インターセプタが ORB にインストールされている場合の実行シーケンスを示します (同様の一連のオペレーションは、複数のターゲットサイド インターセプタでも発生します)。

図 1-3 ORB 上の複数のインターセプタ

ORB 上の複数のインターセプタ

図 1-3 では、以下のイベントを説明しています。

  1. クライアント要求が ORB に到達し、ORB がインターセプタ A から D を順に呼び出します。
  2. 要求がターゲット オブジェクトに送られます。
  3. ターゲット オブジェクトが要求を処理して、応答を返します。
  4. 応答がクライアントサイド インターセプタを含む ORB に戻ります。次に、ORB は登録された各インターセプタを、要求が送出されたときとは逆順に呼び出します。
  5. 応答が返されてクライアント アプリケーションに到達します。

複数のクライアントサイド インターセプタ

ORB は要求を受け取ると、各クライアントサイド インターセプタの client_invoke オペレーションを呼び出します。戻り値 INVOKE_NO_EXCEPTION が各 client_invoke オペレーションから返された場合 (通常の場合)、結果として生じた要求は ORB によってメッセージにマーシャリングされ、ターゲット オブジェクトに送られます。

次の状況では、ORB は、クライアント方向で残りのインターセプタの client_response オペレーションを呼び出すのではなく、これらのインターセプタの exception_occurred を呼び出し、次に例外をクライアント アプリケーションに返します。

複数のターゲットサイド インターセプタ

クライアントサイド インターセプタの処理の場合と同じく、ORB は各ターゲットサイド インターセプタの target_invoke オペレーションを連続的に呼び出します。各 target_invoke オペレーションから戻り値 INVOKE_NO_EXCEPTION が返されると、要求はターゲット オブジェクトに渡されます。

次の状況では、ORB は、クライアント方向で残りのインターセプタの target_response オペレーションを呼び出すのではなく、これらのインターセプタの exception_occurred を呼び出し、次に例外をクライアント アプリケーションに返します。

 


インターセプタおよびメタ オペレーション

メタ オペレーションとは、CORBA Object インタフェースをサポートする is_aget_interface、および non_existent などのオペレーションです。一部のメタ オペレーションは、呼び出しを発行することなく ORB によって実行されますが、それ以外のオペレーション (is_aget_interface、および non_existent メソッド) ではオブジェクトの呼び出しを必要とする場合あります。したがって、これらのオペレーションはインターセプタを開始できます。

オペレーションを CORBA 固有の言語でバインディングすると、オペレーション名を IDL で定義した名前から、次の名前に変換できます。

セキュリティ ベースのインターセプタを実装している場合は、ORB がこれらのオペレーションをクライアント要求の一部として呼び出す可能性があるため、この振る舞いには注意してください。通常、インターセプタが特定のクライアント要求にだけターゲット オブジェクトへの送信を許可し、これらのメタ オペレーションを考慮できないような状況は避けてください。


  ページの先頭       前  次