|
注意: | 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 種類のカテゴリに分類されます。
ClientRequestInterceptor
クラスから継承されます。TargetRequestInterceptor
クラスから継承されます。
CORBA 環境の Oracle Tuxedo システムは、クライアント オブジェクトおよびターゲット オブジェクトの相対的な場所を基準として、インターセプタをインストールして使用できる場所に関する自由度は非常に高くなっています。クライアント アプリケーションからは、要求のターゲットが同じプロセス内にあるのか別のプロセス内にあるのかは、見えません。
クライアントサイド インターセプタとターゲットサイド インターセプタは別個のインタフェースから継承されていますが、両者を単一のソース ファイル内に実装すると都合のよい場合が多くあります。
次の図は、要求レベルのインターセプタと Oracle Tuxedo システムの関係を示します。
CORBA インターセプタの Oracle Tuxedo 実装については、次の事項に留意してください。
呼び出しの正常な要求応答サイクル 1 回の間に、クライアントサイド インターセプタは ORB によって 2 回呼び出されます。
呼び出しの要求応答サイクル 1 回の間に、ターゲットサイド インターセプタは ORB によって 2 回呼び出されます。
ORB は、登録されたインターセプタのリストを維持します。インターセプタの登録は、管理タスクとして行う操作です。複数のインターセプタをインストールおよび作成できるので、アプリケーション実行時に、ORB はこのリストを使用して、いつ、どの順番でインターセプタを呼び出すべきかを決定します。複数のインターセプタを登録した場合、ORB は各インターセプタを連続的に実行します。複数のインターセプタの呼び出しの順序を設定するのも、管理タスクの 1 つです。
要求レベルのインターセプタは、以下のような数種類のサービス アプリケーションを実装する際に、特に有用です。
CORBA インターセプタに対する現在の制限事項は、以下のとおりです。
DataInputStream
オブジェクトへの書き込みはできません。Tobj_Bootstrap
オブジェクトのメソッドを呼び出すことはできません。REPLY_NO_EXCEPTION
の戻りステータス値はサポートされていません。ただしインターセプタ クラスのメソッド シグネチャ オペレーションでは使用されます。RequestLevelInterceptor
インタフェースから派生したクラスのオペレーションのためのメソッド シグネチャには、次のインタフェースのパラメータが含まれます。RequestLevelInterceptor::DataOutputStream
RequestLevelInterceptor::ServiceContextList
これらのインタフェースは Oracle Tuxedo 製品では使用しません。これらのインタフェースが Oracle Tuxedo ソフトウェアで定義されているのは、Oracle Tuxedo 製品の将来のリリースでこれらのインタフェースの実装が提供された場合に、CORBA アプリケーションを再コンパイルする必要性をなくすためです。ORB は常に実際の引数に対する nil オブジェクトを渡します。これらの引数を使用しないでください。プロセスが深刻なエラーにより停止することが予想されます。
以下の節では、インターセプタを使用する CORBA アプリケーションの実行中に行われる処理を説明します。一般に、要求レベルのインターセプタのインスタンス化と初期化は、ORB の初期化時にのみ行われます。それ以外では、要求レベルのインターセプタをインスタンス化できません。
インターセプタの戻りステータスにより、ORB 実行時およびインストールされている可能性があるほかの要求レベルのインターセプタの実行フローが制御されます。
呼び出された後のインターセプタの戻りステータスに応じて、次のイベントのうち 1 つが発生することがあります。
複数の要求レベルのインターセプタを、1 回の呼び出しに関連付けることができます。あるインターセプタが別のインターセプタを認識する必要は、まったくありません。
呼び出しの要求応答サイクル内で起こるイベントは、次の 2 つのカテゴリに分けて提示されます。
呼び出しの要求応答サイクルにおいて、各インターセプタは 2 回呼び出されます。1 回目は要求がクライアントからターゲットに向かうとき、2 回目は応答がクライアントに返るときです。クライアントのインターセプタ クラス ClientRequestInterceptor
には、これら 2 つの呼び出しに特に対応するオペレーションが 2 つあります。
クライアントサイド インターセプタを使用する CORBA アプリケーションの実行フローを図 1-1 に示します。この図では、基本的かつ正常な要求応答呼び出しサイクルを示します。つまり、このサイクルでは例外は発生しません。
図 1-1 では、以下のイベントを説明しています。
client_invoke
オペレーションを呼び出します (「複数の要求レベルのインターセプタの使用方法」では、複数のクライアントサイド インターセプタがインストールされている場合に生じる現象について説明します)。client_invoke
オペレーションの結果として返される例外がない場合、要求はターゲット オブジェクトへのパスを再開します。client_response
オペレーションを呼び出します。
client_invoke
および client_response
オペレーションは各々、クライアント インターセプタの処理を続行するかどうかを示すステータス値を返します。インターセプタは、例外処理を引き起こす例外ステータス値を返すことがあります。
表 1-1 は、これらのオペレーションから返されるステータス値に応じて生じる現象、およびインターセプタが ORB と共に例外を処理する方法を示します。
exception_occurred オペレーションを呼び出します。exception_occurred メソッドは、ORB がクライアント アプリケーションに例外を返す前に状態をクリーンアップする機会を、これより前のインターセプタに提供します。これにより、ORB は呼び出しを短絡し、呼び出しは完了します。exception_occurred メソッドの詳細については、「exception_occurred メソッド」を参照してください。
|
||
クライアントサイドと同じく、ターゲットサイド インターセプタは要求応答サイクル中に 2 回呼び出されます。ターゲットサイド インターセプタは TargetRequestInterceptor
クラスから継承されます。このクラスには、次のオペレーションが含まれます。
ターゲットサイド インターセプタを使用する CORBA アプリケーションの実行フローを図 1-2 に示します。この図では、基本的かつ正常な要求応答呼び出しサイクルを示します。つまり、このサイクルでは例外は発生しません。
図 1-2 では、以下のイベントを説明しています。
target_invoke
オペレーションを呼び出します (複数のターゲットサイド インターセプタがインストールされている場合に生じる現象については「複数の要求レベルのインターセプタの使用方法」の節で説明します)。target_invoke
オペレーションの実行中に発生する例外がない場合、要求がターゲット オブジェクトへのパスを再開します。target_response
オペレーションを呼び出します。
表 1-2 は、target_invoke
および target_response
オペレーションによって返されるステータス値に応じて、ターゲットサイドの呼び出しに生じる現象を示し、例外が送出された場合の動作を説明します。
exception_occurred オペレーションを呼び出します。exception_occurred メソッドは、ORB がクライアント ORB に例外を返す前に状態をクリーンアップする機会を、これより前のインターセプタに提供します。これにより、ターゲット ORB は呼び出しを短絡し、呼び出しは完了します。exception_occurred メソッドの詳細については、「exception_occurred メソッド」を参照してください。
|
||
すべてのインターセプタに exception_occurred
メソッドが存在します。ORB はこのメソッドを、次の状況下で呼び出します。
client_response
または target_response
メソッドではなく、exception_occurred
メソッドとなります。インターセプタはこの振る舞いを利用して、例外を含む応答が処理されるコンテキストと、例外の実際の値を、DataInputStream
構造体からの例外を読み取ることなく検査できます。Request
オブジェクトに対する遅延同期 DII 呼び出しを使用し、その後 Request
オブジェクトを解放します。この場合、クライアントに送信される応答はありません。
前述の状況の 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 は要求を受け取ると、各クライアントサイド インターセプタの 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_a
、get_interface
、および non_existent
などのオペレーションです。一部のメタ オペレーションは、呼び出しを発行することなく ORB によって実行されますが、それ以外のオペレーション (is_a
、get_interface
、および non_existent
メソッド) ではオブジェクトの呼び出しを必要とする場合あります。したがって、これらのオペレーションはインターセプタを開始できます。
オペレーションを CORBA 固有の言語でバインディングすると、オペレーション名を IDL で定義した名前から、次の名前に変換できます。
セキュリティ ベースのインターセプタを実装している場合は、ORB がこれらのオペレーションをクライアント要求の一部として呼び出す可能性があるため、この振る舞いには注意してください。通常、インターセプタが特定のクライアント要求にだけターゲット オブジェクトへの送信を許可し、これらのメタ オペレーションを考慮できないような状況は避けてください。