ORB.init
への呼び出しで返された後は、インタセプタはその ORB に登録できません。
インタセプタの登録は、ORBInitializer
インタフェースを実装する関連付けられた ORBInitializer
オブジェクトを登録する方法で行われます。ORB は、初期化しているときに、登録されている各 ORBInitializer
を呼び出し、そのインタセプタの登録に使用される ORBInitInfo
オブジェクトをそれに渡します。
Java で ORB 初期化子を登録する
ORBInitializers は、Java ORB プロパティーを経由して登録されます。
このプロパティー名は以下の形式をとります。
org.omg.PortableInterceptor.ORBInitializerClass.<Service>
<Service>
は次のプロパティーを実装するクラスの文字列名です。
org.omg.PortableInterceptor.ORBInitializer
名前の衝突を防ぐため、逆方向の DNS 命名規則が使用されます。たとえば、X 社に初期化子が 3 つある場合、次のプロパティーを定義できます。
org.omg.PortableInterceptor.ORBInitializerClass.com.x.Init1
org.omg.PortableInterceptor.ORBInitializerClass.com.x.Init2
org.omg.PortableInterceptor.ORBInitializerClass.com.x.Init3
ORB.init の実行中は、org.omg.PortableInterceptor.ORBInitializerClass
で始まるこれらの ORB プロパティーが収集され、各プロパティーの <Service>
部分が取り出され、クラス名に <Service>
文字列を使用してオブジェクトがインスタンス化され、そのオブジェクトに対して pre_init
と post_init
の各メソッドが呼び出されます。例外があっても ORB は無視して処理を行います。
例
たとえば、X 社が記述クライアント側のロギングサービスに次の ORBInitializer 実装があるとします。
package com.x.logging;
import org.omg.PortableInterceptor.Interceptor;
import org.omg.PortableInterceptor.ORBInitializer;
import org.omg.PortableInterceptor.ORBInitInfo;
public class LoggingService implements ORBInitializer {
void pre_init( ORBInitInfo info ) {
// Instantiate the Logging Service s Interceptor.
Interceptor interceptor = new LoggingInterceptor();
// Register the Logging Service s Interceptor.
info.add_client_request_interceptor( interceptor );
}
void post_init( ORBInitInfo info ) {
// This service does not need two init points.
}
}
このロギングサービスを使用して MyApp
というプログラムを実行する場合、ユーザーは次のように入力します。
java
-Dorg.omg.PortableInterceptor.ORBInitializerClass.com.x.Logging.LoggingService
MyApp
インタセプタ登録時の注意
要求インタセプタは、ORB ベースで登録されます。
オブジェクトごとの仮想インタセプタを実現するには、遮断点におけるターゲット上のポリシー問い合わせ、作業の必要性の有無を決定します。
POA ごとの仮想インタセプタを実現する場合は、各 POA を異なる ORB でインスタンス化してください。インタセプタは管理しやすいように順序付けられていますが、インタセプタの登録と順序は何の関係もありません。要求インタセプタではサービスのコンテキストが関連しています。サービスコンテキストには順番がないため、要求インタセプタに順番を付ける必要はありません。IOR インタセプタはタグ付きコンポーネントが関連しています。タグ付きコンポーネントにも順序付けがないので、IOR インタセプタに順序付けをすることは意味がありません。
登録コードでは ORB を使わないようにします。つまり、与えられた orb_id
で ORB.init
を呼び出さないようにします。ORB の初期化中に登録が発生するので、この状態でこの ORB を呼び出しても結果は定義されません。
- 関連項目:
ORBInitInfo
pre_init
void pre_init(ORBInitInfo info)
- ORB の初期化中に呼び出されます。インタセプタによって登録された初期サービスがほかのインタセプタによって使用されるものと考えられる場合は、この時点で
ORBInitInfo.register_initial_reference
の呼び出しを介してそれらの初期サービスが登録されます。
- パラメータ:
info
- インタセプタを登録するための初期化属性と オペレーションを提供する
post_init
void post_init(ORBInitInfo info)
- ORB の初期化中に呼び出されます。サービスがその初期化の一環として初期参照を解釈処理する必要がある場合は、この時点ですべての初期参照が利用できるものとします。
post_init
オペレーションの呼び出しは、ORB 初期化処理の最後のタスクではありません。post_init
呼び出しのあとに行われる最後のタスクでは、登録されたインタセプタのリストを ORB に組み込みます。したがって、post_init
の呼び出し時は ORB にそれらのインタセプタは含まれていません。post_init
内部から ORB を介して呼び出しを行っても、その呼び出しに対して起動される要求インタセプタはありません。同様に、IOR が作成されるオペレーションを実行しても、起動される IOR インタセプタはありません。
- パラメータ:
info
- インタセプタを登録するための初期化属性と オペレーションを提供する
バグの報告と機能のリクエスト
さらに詳しい API リファレンスおよび開発者ドキュメントについては、Java SE 開発者用ドキュメントを参照してください。開発者向けの詳細な解説、概念の概要、用語の定義、バグの回避策、およびコード実例が含まれています。Copyright 2009 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。