このドキュメントを J2SETM ドキュメントバンドルの一部としてダウンロードした場合は、Web サイト http://java.sun.com/j2se/1.4/docs/guide/idl/POA.html を参照して、更新されているかどうかを確認してください。
「オブジェクトアダプタ」は、オブジェクト参照を使用する要求と適切なコードを接続して、その要求にサービスを提供する機構です。 ポータブルオブジェクトアダプタ (POA) は、CORBA 仕様によって定義された特別な種類のオブジェクトアダプタです。 POA は次の目標を満たすように設計されています。
このドキュメントでは、Java 2 Platform, Standard Edition での POA の使用法の概要について説明します。 POA の詳細については、CORBA 2.3.1 仕様 の第 11 章を参照してください。
POA を作成して使用するための手順は、開発する特定のアプリケーションによって異なります。 POA のライフサイクルでは、通常、次の手順を実行します。
手順 1: ルート POA の取得
手順 2: POA のポリシーの定義最初の手順は、1 番目の POA の取得です。この POA は「ルート POA」と呼ばれます。 ルート POA は、ORB によって管理され、ORB 初期化インタフェースを使用するアプリケーションに「RootPOA」という初期オブジェクト名で提供されます。
ルート POA オブジェクトを取得し、それを POA にキャストするコードの例を次に示します。
ORB orb = ORB.init( args, null ); POA rootPOA = POAHelper.narrow( orb.resolve_initial_references("RootPOA"));
手順 3: POA の作成ポータブルオブジェクトアダプタ (POA) は、複数の ORB 実装で使用できるオブジェクトアダプタを提供するために設計されており、異なるベンダーの実装を扱う場合も書き直す必要がないようになっています。
POA は、少なくともクライアントの立場からは持続オブジェクトが可能になるようにしています。 つまり、サーバが物理的に何度再起動されても、そのクライアントが関係する範囲では、これらのオブジェクトは常に稼働しており、オブジェクトに格納されたデータ値が維持されています。
POA を使用すると、オブジェクトの実装者は、オブジェクトの識別、状態、記憶領域、およびライフサイクルに関してより多くの制御を行うことができます。 POA は、使用されるポリシーやデフォルト値を定義しないで作成できます。 ルート POA にはデフォルトで次のポリシーが定義されています。
- スレッドポリシー: ORB_CTRL_MODEL
- ライフタイムポリシー: TRANSIENT
- オブジェクト ID 一意性ポリシー: UNIQUE_ID
- ID 割り当てポリシー: SYSTEM_ID
- サーバント保持ポリシー: RETAIN
- 要求処理ポリシー: USE_ACTIVE_OBJECT_MAP_ONLY
- 暗黙的起動ポリシー: IMPLICIT_ACTIVATION
次のコードは、RMI-IIOP を使った POAの例でのポリシーの設定方法を示しています。
Policy[] tpolicy = new Policy[3]; tpolicy[0] = rootPOA.create_lifespan_policy( LifespanPolicyValue.TRANSIENT ); tpolicy[1] = rootPOA.create_request_processing_policy( RequestProcessingPolicyValue.USE_ACTIVE_OBJECT_MAP_ONLY ); tpolicy[2] = rootPOA.create_servant_retention_policy( ServantRetentionPolicyValue.RETAIN);次に各ポリシーについて簡単に説明します。 POA ポリシーの詳細は、CORBA/IIOP 2.3.1 仕様 (http://cgi.omg.org/cgi-bin/doc?formal/99-10-07) の第 11 章「Portable Object Adapter」を参照してください。
スレッドポリシー
このポリシーは、作成済みの POA とともに使用されるスレッドモデルを指定します。 デフォルトは
ORB_CTRL_MODEL
です。
ThreadPolicyValue
には、次の値を指定できます。
ORB_CTRL_MODEL
- ORB によって制御される POA に対する要求のスレッドへの割り当てを ORB が行うSINGLE_THREAD_MODEL
- シングルスレッド POA に対する要求が順次処理される (注: このポリシーは、Sun の J2SE v.1.4 に含まれる ORB ではサポートされていない)ライフタイムポリシー
このポリシーは、作成済みの POA 内で実装されるオブジェクトのライフタイムを指定します。 デフォルトは
TRANSIENT
です。
LifespanPolicyValue
には、次の値を指定できます。
TRANSIENT
- POA で実装されたオブジェクトは、そのオブジェクトが最初に作成された POA インスタンスより長く持続することはできないPERSISTENT
- POA で実装されたオブジェクトは、そのオブジェクトが最初に作成されたプロセスより長く持続できるオブジェクト ID 一意性ポリシー
このポリシーは、作成済みの POA 内で起動されるサーバントが一意のオブジェクト ID を持つ必要があるかどうかを指定します。 デフォルトは
UNIQUE_ID
です。
IdUniquenessPolicyValue
には、次の値を指定できます。
UNIQUE_ID
- その POA を使用して起動されるサーバントはオブジェクト ID を 1 つだけ持つMULTIPLE_ID
- その POA を使用して起動されるサーバントは 1 つまたは複数のオブジェクト ID を持つことができるID 割り当てポリシー
このポリシーは、作成済みの POA 内のオブジェクト ID がアプリケーションまたは ORB のどちらによって生成されるかを指定します。 デフォルトは
SYSTEM_ID
です。
IdAssignmentPolicyValue
には、次の値を指定できます。
USER_ID
- その POA を使用して作成されるオブジェクトには、アプリケーションによってのみオブジェクト ID が割り当てられるSYSTEM_ID
- その POA を使用して作成されるオブジェクトには、POA によって一意のオブジェクト ID が割り当てられる。 その POA にPERSISTENT
ポリシーも定義されている場合、割り当てられるオブジェクト ID は、同じ POA によって生成されるすべてのインスタンスで一意になる必要があるサーバント保持ポリシー
このポリシーは、作成済みの POA が、アクティブオブジェクトマップ内にアクティブなサーバントを保持するかどうかを指定します。 デフォルトは
RETAIN
です。
ServantRetentionPolicyValue
には、次の値を指定できます。
RETAIN
- POA がアクティブオブジェクトマップ内にアクティブなサーバントを保持することを示すNON_RETAIN
- サーバントが POA によって保持されないことを示す要求処理ポリシー
このポリシーは、作成済みの POA による要求の処理方法を指定します。 デフォルトは
USE_ACTIVE_OBJECT_MAP_ONLY
です。
RequestProcessingPolicyValue
には、次の値を指定できます。
USE_ACTIVE_OBJECT_MAP_ONLY
- オブジェクト ID がアクティブオブジェクトマップ内で見つからない場合、クライアントにOBJECT_NOT_EXIST
例外が返される。 この場合、RETAIN
ポリシーも必要USE_DEFAULT_SERVANT
- オブジェクト ID がアクティブオブジェクトマップ内で見つからない場合、またはNON_RETAIN
ポリシーが存在する場合、set_servant
オペレーションを使ってデフォルトサーバントが POA に登録されていれば、要求はデフォルトサーバントにディスパッチされるUSE_SERVANT_MANAGER
- オブジェクト ID がアクティブオブジェクトマップ内で見つからない場合、またはNON_RETAIN
ポリシーが存在する場合、set_servant_manager
オペレーションを使ってサーバントマネージャが POA に登録されていれば、サーバントマネージャがサーバントを検索または起動するか、あるいは例外を発生させる暗黙的起動ポリシー
このポリシーは、作成済みの POA でサーバントの暗黙的な起動がサポートされるかどうかを指定します。 デフォルト値は
IMPLICIT_ACTIVATION
です。
ImplicitActivationPolicyValue
には、次の値を指定できます。
IMPLICIT_ACTIVATION
- サーバントの暗黙的な起動を示す。 このポリシーを設定する場合は、SYSTEM_ID
ポリシーとRETAIN
ポリシーを設定する必要があるNO_IMPLICIT_ACTIVATION
- サーバントの暗黙的な起動を行わないことを示す
手順 4: POAManager の起動アプリケーション開発者は、新しい POA を作成することによって、新しい POA 用に選択した特定のポリシーを宣言し、異なるアダプタアクティベータおよびサーバントマネージャ (これらは、POA が必要な POA の起動とサーバントの起動を行うために使用するコールバックオブジェクト) を提供できます。 オブジェクト ID は POA に対して相対的に解釈されるため、アプリケーション開発者は、新しい POA を作成することによってさらにオブジェクトの名前空間の区分けも行うことができます。 また、新しい POA を作成すると、開発者は、複数のオブジェクトのセットに対する要求の処理を個別に制御できます。
POA は、親の POA に対する create_POA オペレーションを使用して、既存の POA の子として作成されます。 新しい POA を作成するには、以下の情報を渡します。
- POA の名前。 POA に付ける名前は、同じ親を持つすべての POA で一意でなければならない。 次の例では、POA に
childPOA
という名前を付ける- POA マネージャ。 新しい POA に関連付ける POA マネージャを指定する。 次の例で示すように、このパラメータとして null を渡すと、新しい POA マネージャが作成される。 ユーザは、別の POA の POA マネージャを渡すこともできる
- ポリシーリスト。 POA の動作を制御するために POA に関連付けるポリシーリストを指定する。 次の例では、この POA に対して持続ライフタイムポリシーがすでに定義されている
次のコードは、持続続サーバを使った Hello World の例での POA の作成方法を示します。
// Create a POA by passing the Persistent Policy POA persistentPOA = rootPOA.create_POA("childPOA", null, persistentPolicy );
各 POA オブジェクトには
POAManager
オブジェクトが関連付けられます。POAManager
オブジェクトは、POA に対する要求をキューに入れるか破棄するかといった、関連 POA の処理状態を制御します。POAManager
は、POA を停止することもできます。 POA マネージャは、1 つ以上の POA オブジェクトに関連付けられることがあります。
POAManager
には、次の状態を指定できます。
- 保持 - この状態の場合、関連する POA は着信要求をキューに入れる
- 起動 - この状態の場合、関連する POA は要求の処理を開始する
- 破棄 - この状態の場合、関連する POA は着信要求を破棄する
- 停止 - この状態の場合、関連する POA は、実行が開始されていない要求と、すべての新規要求を拒否する
これらの状態の詳細については、
POAManagerOperations
の javadoc を参照してください。POA マネージャは、作成時に自動的に起動されません。 次のコードは、持続サーバを使った Hello World の例での POAManager の起動方法を示します。 この方法で POA マネージャを起動しないと、POA マネージャはデフォルトでは
HOLD
状態になっているため、Servant
に対するすべての呼び出しがハングアップしてしまいます。// Activate PersistentPOA's POAManager. Without this step, // all calls to Persistent Server will hang because POAManager // will be in the 'HOLD' state. persistentPOA.the_POAManager().activate( );
手順 6: オブジェクト参照の作成以下の説明は、CORBA 仕様の 11.2.5 項から引用したものです。
CORBA オブジェクトは、アクティブなサーバントに関連付けられる場合と関連付けられない場合があります。POA に
RETAIN
ポリシーが定義されている場合、サーバントとサーバントに関連付けられたオブジェクト ID が、適切な POA のアクティブオブジェクトマップに入力されます。 このような起動は、次のどれかの方法で実行できます。
- サーバアプリケーション自体が、
activate_object
オペレーションまたはactivate_object_with_id
オペレーションを使用して、個々のオブジェクトを明示的に起動する
- サーバアプリケーションが、ユーザ指定のサーバントマネージャを起動することによって必要なオブジェクトを起動するように POA に指示する。 サーバアプリケーションは、
set_servant_manager
を使用してこのサーバントマネージャを登録する
IMPLICIT_ACTIVATION
ポリシーが有効でかつ言語バインディングで次のようなオペレーションが許可されている状況では、サーバアプリケーションが、起動されていない (つまりオブジェクト ID が関連付けられていない) サーバントの参照を取得しようとしたときに、POA がオブジェクトを暗黙的に起動できる
USE_DEFAULT_SERVANT
ポリシーも有効になっている場合、サーバアプリケーションは、オブジェクト ID にかかわらず、1 つのサーバントを起動することによって未知のオブジェクトを起動するように POA に指示します。 サーバアプリケーションは、set_servant
を使用してこのサーバントを登録します。POA に
NON_RETAIN
ポリシーが定義されている場合、POAは、すべての要求に対して、デフォルトのサーバントまたはサーバントマネージャを使用してアクティブなサーバントを探すことができます。 POA から見ると、サーバントは、1 つの要求の処理中だけアクティブになっています。 POA は、サーバントとオブジェクトの関連付けをアクティブオブジェクトマップに入力しません。RMI-IIOP テクノロジを使用している実装は、その実装をインタフェースに関連付けるために委譲 (「Tie モデル」と呼ばれる) を使用します。 実装のインスタンスを作成したときは、そのインスタンスを CORBA インタフェースに関連付けるために Tie オブジェクトを作成する必要もあります。 次のコードは、POA ポリシーが
USE_ACTIVE_OBJECT_MAP_ONLY
の場合に Tie を起動する方法を示しています。 このサンプルコードは、RMI-IIOP を使った POA の例で使用されているものです。
_HelloImpl_Tie tie = (_HelloImpl_Tie)Util.getTie( helloImpl ); String helloId = "hello"; byte[] id = helloId.getBytes(); tPOA.activate_object_with_id( id, tie );CORBA 仕様には、オブジェクト参照の作成 (11.2.4 項)、オブジェクトの起動 (11.2.5 項)、および要求の処理 (11.2.6 項) に関する詳しい説明が記載されています。 詳細は、CORBA 2.3.1 仕様を参照してください。
オブジェクト参照はサーバで作成されます。 作成したオブジェクト参照はクライアントにエクスポートできます。 オブジェクト参照は、オブジェクトの識別情報をカプセル化し、さらにオブジェクトに関連付けられているサーバと POA を識別して探すために ORB が必要とする情報をカプセル化します。 参照は、次のいくつかの方法で作成されます。
- サーバントを明示的に起動し、オブジェクト参照に関連付ける
次の例は、持続サーバを使った Hello World の例で使用されているものです。 この例では、
servant_to_reference
オペレーションを使用して、起動したサーバントを対応するオブジェクト参照にマッピングします。
// Resolve Root Naming context and bind a name for the // servant. org.omg.CORBA.Object obj = orb.resolve_initial_references( "NameService" ); NamingContextExt rootContext = NamingContextExtHelper.narrow( obj ); NameComponent[] nc = rootContext.to_name( "PersistentServerTutorial" ); rootContext.rebind( nc, persistentPOA.servant_to_reference( servant ) );
サーバアプリケーションが直接参照を作成する 次の例は、RMI-IIOP を使った POA の例で使用されているものです。 この例では、次のコードによって直接参照を作成します。 そのために、抽象オブジェクトを実体化しますが、そのオブジェクトをアクティブなサーバントには関連付けません。
// Publish the object reference using the same object id // used to activate the Tie object. Context initialNamingContext = new InitialContext(); initialNamingContext.rebind("HelloService", tPOA.create_reference_with_id(id, tie._all_interfaces(tPOA,id)[0]) );
サーバアプリケーションがサーバント自体を暗黙的に起動させる この動作は、
IMPLICIT_ACTIVATION
ポリシーを使用して POA を作成した場合にだけ発生します。これはデフォルトの動作です。サーバで作成した参照は、クライアントに提供することができます。 オブジェクト参照の作成とクライアントへのエクスポートの詳細については、CORBA 2.3.1 仕様 の 11.2.4 項を参照してください。
アダプタアクティベータはオプションです。 アダプタアクティベータは、要求の処理中に POA を作成する必要がある場合に使用します。 アプリケーションの実行時に、必要な POA がすべて作成されている場合は、アダプタアクティベータは必要ありません。
アダプタアクティベータを使用すると、POA は、必要に応じて子 POA を作成できるようになります。子 POA の作成は、子 POA (または複数の子のどれか) を指定した要求を受信したときの副作用として実行されるか、あるいは起動パラメータ値 TRUE を使用して find_POA
メソッドが呼び出されたときに実行されます。 ORB は、存在していない子 POA への要求を受け取ると、アダプタアクティベータのオペレーションを呼び出します。 アダプタアクティベータは必要な POA をその場で作成します。
要求は、ターゲットオブジェクトのオブジェクト ID と、ターゲットオブジェクト参照を作成した POA の識別情報を伝達できる必要があります。 クライアントから要求が発行されると、ORB は、初めに適切なサーバを探し (必要な場合は起動する)、次にそのサーバ内で適切な POA を探します。
サーバプロセス内に POA が存在しない場合、アプリケーションは、アダプタアクティベータを使用して必要な POA を再作成することができます。 アダプタアクティベータは、ユーザによって実装されるオブジェクトで、POA に関連付けることができます。 アダプタアクティベータは、存在していない POA への要求を受け取った場合に、ORB によって呼び出されます。 ここでアダプタアクティベータに、必要な POA を作成する機会が与えられます。 アダプタアクティベータが POA を作成しない場合、クライアントは ADAPTER_NONEXISTENT
例外を受け取ります。
ORB は、必要な POA を見つけると、その POA に要求を渡します。そのあとの要求の処理は、POA に関連付けられているポリシーと、オブジェクトの現在の起動状態によって異なります。
アダプタアクティベータの詳細については、CORBA 2.3.1 仕様 の 11.3.3 項または AdapterActivatorOperations API ドキュメントを参照してください。
このドキュメントを J2SE 1.4 ドキュメントバンドルの一部として参照している場合は、Web サイト http://java.sun.com/j2se/1.4/docs/guide/idl/POA.html#adapteractivator を参照して、このトピックが更新されているかどうかを確認してください。
サーバントマネージャはオプションです。 サーバントマネージャを使用すると、POA が、無効なオブジェクトに対する要求を受け取ったときに、必要なサーバントを起動できるようになります。 サーバが起動時にすべてのオブジェクトをロードする場合は、サーバントマネージャは必要ありません。
サーバントマネージャ は、アプリケーション開発者が POA と関連付けることができるコールバックオブジェクトです。 ORB はサーバントマネージャのオペレーションを呼び出して、必要に応じてサーバントを起動したり停止したりします。 サーバントマネージャには、オブジェクト ID 値で特徴づけられるオブジェクト参照と特定のサーバントの関連を管理し、オブジェクト参照が存在するかどうかを決定する機能があります。 各型のサーバントマネージャは 2 つのオペレーションを実行できます。1 つはサーバントを見つけて返すためのオペレーションで、もう 1 つはサーバントを停止するためのオペレーションです。 オペレーションは、その状況で使用できる情報の量によって異なります。
サーバントマネージャを使用するには、USE_SERVANT_MANAGER
ポリシーを設定する必要があります。 このポリシーを設定すると、POA 内のほかのポリシーに応じて、特定の状況で使用されるサーバントマネージャの型が決まります。 サーバントマネージャには次の 2 つの型があります。
ServantActivator
POA に RETAIN
ポリシーが定義されている場合、POA は、ServantActivator
型のサーバントマネージャを使用します。
この型は、通常、持続オブジェクトを起動するために使われます。
ServantLocator
POA に NON_RETAIN
ポリシーが定義されている場合、POA は、ServantLocator
型のサーバントマネージャを使用します。 POA は、このサーバントマネージャによって返されるサーバントが単一の要求の処理にだけ使用されることを認識しています。そのため、POA は、サーバントマネージャのオペレーションに追加の情報を提供することができ、サーバントマネージャの複数のオペレーションを連携させて、ServantActivator
とは異なる処理を実行できます。 POA が ServantLocator
インタフェースを使用する場合、事前呼び出しによって返されたサーバントの呼び出しオペレーションを実行した直後に、POA は、サーバントマネージャの事後呼び出しを実行し、ObjectId 値および Servant 値をパラメータの一部として渡します。 この機能を使用すると、POA に関連付けられているオブジェクトに対するすべての要求を確実にサーバントマネージャで調整できます。
この型は、通常、一時オブジェクトを起動するために使われます。
サーバントマネージャの詳細については、CORBA 2.3.1 仕様 の 11.3.4 項を参照してください。
このドキュメントを J2SE 1.4 ドキュメントバンドルの一部として参照している場合は、Web サイト http://java.sun.com/j2se/1.4/docs/guide/idl/POA.html#servantmanager を参照して、このトピックが更新されているかどうかを確認してください。
POA::createPOA に対する POAManager パラメータとして null を渡す場合は、新しく POA を作成するときに POAManager.activate() が必要です。 null を渡すと、新しい POAManager が作成され、作成される POA に関連付けられます。 この場合は、POAManager.activate() が必要です。
同じ POAManager を使用して複数の POA を制御するには、次の手順を実行します。
プログラマが上記のように明示的にプログラミングしない限り、ルート POA の POAManager とほかの POA の間に暗黙的な関係は存在しません。
詳細については、CORBA specification, formal/99-10-07 の 11.3.2 項を参照してください。
Java IDL トップへ |