ポータブルオブジェクトアダプタ (POA)


ポータブルオブジェクトアダプタ (POA) とは

「オブジェクトアダプタ」は、オブジェクト参照を使用する要求と適切なコードを接続して、その要求にサービスを提供する機構です。ポータブルオブジェクトアダプタ (POA) は、CORBA 仕様によって定義された特別な種類のオブジェクトアダプタです。POA は次の目標を満たすように設計されています。

このドキュメントでは、Java 2 Platform, Standard Edition での POA の使用法の概要について説明します。POA の詳細については、CORBA 2.3.1 仕様の第 11 章を参照してください。

POA の作成と使用

POA を作成して使用するための手順は、開発する特定のアプリケーションによって異なります。POA のライフサイクルでは、通常、次の手順を実行します。

  1. ルート POA の取得
  2. POA のポリシーの定義
  3. POA の作成
  4. POAManager の起動
  5. サーバントの起動 (Tie の起動を含む場合がある)
  6. POA からのオブジェクト参照の作成

次にこれらの各手順について詳しく説明します。

手順 1: ルート 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"));
手順 2: POA のポリシーの定義

ポータブルオブジェクトアダプタ (POA) は、複数の ORB 実装で使用できるオブジェクトアダプタを提供するために設計されており、異なるベンダーの実装を扱う場合も書き直す必要がないようになっています。

POA は、少なくともクライアントの立場からは持続オブジェクトが可能になるようにしています。つまり、サーバが物理的に何度再起動されても、そのクライアントが関係する範囲では、これらのオブジェクトは常に稼働しており、オブジェクトに格納されたデータ値が維持されています。

POA を使用すると、オブジェクトの実装者は、オブジェクトの識別、状態、記憶領域、およびライフサイクルに関してより多くの制御を行うことができます。POA は、使用されるポリシーやデフォルト値を定義しないで作成できます。ルート POA にはデフォルトで次のポリシーが定義されています。

次のコードは、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://www.omg.org/docs/formal/99-10-07.pdf) の第 11 章「Portable Object Adapter」を参照してください。

スレッドポリシー

このポリシーは、作成済みの POA とともに使用されるスレッドモデルを指定します。デフォルトは ORB_CTRL_MODEL です。

ThreadPolicyValue には、次の値を指定できます。

ライフタイムポリシー

このポリシーは、作成済みの POA 内で実装されるオブジェクトのライフタイムを指定します。デフォルトは TRANSIENT です。

LifespanPolicyValue には、次の値を指定できます。

オブジェクト ID 一意性ポリシー

このポリシーは、作成済みの POA 内で起動されるサーバントが一意のオブジェクト ID を持つ必要があるかどうかを指定します。デフォルトは UNIQUE_ID です。

IdUniquenessPolicyValue には、次の値を指定できます。

ID 割り当てポリシー

このポリシーは、作成済みの POA 内のオブジェクト ID がアプリケーションまたは ORB のどちらによって生成されるかを指定します。デフォルトは SYSTEM_ID です。

IdAssignmentPolicyValue には、次の値を指定できます。

サーバント保持ポリシー

このポリシーは、作成済みの POA が、アクティブオブジェクトマップ内にアクティブなサーバントを保持するかどうかを指定します。デフォルトは RETAIN です。

ServantRetentionPolicyValue には、次の値を指定できます。

要求処理ポリシー

このポリシーは、作成済みの POA による要求の処理方法を指定します。デフォルトは USE_ACTIVE_OBJECT_MAP_ONLY です。

RequestProcessingPolicyValue には、次の値を指定できます。

暗黙的起動ポリシー

このポリシーは、作成済みの POA でサーバントの暗黙的な起動がサポートされるかどうかを指定します。デフォルト値は IMPLICIT_ACTIVATION です。

ImplicitActivationPolicyValue には、次の値を指定できます。

手順 3: POA の作成

アプリケーション開発者は、新しい POA を作成することによって、新しい POA 用に選択した特定のポリシーを宣言し、異なるアダプタアクティベータおよびサーバントマネージャ (これらは、POA が必要な POA の起動とサーバントの起動を行うために使用するコールバックオブジェクト) を提供できます。オブジェクト ID は POA に対して相対的に解釈されるため、アプリケーション開発者は、新しい POA を作成することによってさらにオブジェクトの名前空間の区分けも行うことができます。また、新しい POA を作成すると、開発者は、複数のオブジェクトのセットに対する要求の処理を個別に制御できます。

POA は、親の POA に対する create_POA 操作を使用して、既存の POA の子として作成されます。新しい POA を作成するには、以下の情報を渡します。

次のコードは、持続サーバを使った Hello World の例での POA の作成方法を示します。

手順 4: POAManager の起動

各 POA オブジェクトには POAManager オブジェクトが関連付けられます。POAManager オブジェクトは、POA に対する要求をキューに入れるか破棄するかといった、関連 POA の処理状態を制御します。POAManager は、POA を停止することもできます。POA マネージャは、1 つ以上の POA オブジェクトに関連付けられることがあります。

POAManager には、次の状態を指定できます。

これらの状態の詳細については、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( );

手順 5: サーバント の起動

以下の説明は、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 の例で使用されているものです。

CORBA 仕様には、オブジェクト参照の作成 (11.2.4 項)、オブジェクトの起動 (11.2.5 項)、および要求の処理 (11.2.6 項) に関する詳しい説明が記載されています。詳細は、CORBA 2.3.1 仕様を参照してください。

手順 6: オブジェクト参照の作成

オブジェクト参照はサーバで作成されます。作成したオブジェクト参照はクライアントにエクスポートできます。オブジェクト参照は、オブジェクトの識別情報をカプセル化し、さらにオブジェクトに関連付けられているサーバと POA を識別して探すために ORB が必要とする情報をカプセル化します。参照は、次のいくつかの方法で作成されます。

サーバで作成した参照は、クライアントに提供することができます。オブジェクト参照の作成とクライアントへのエクスポートの詳細については、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 ドキュメント」を参照してください。

サーバントマネージャ

サーバントマネージャはオプションです。サーバントマネージャを使用すると、POA が、無効なオブジェクトに対する要求を受け取ったときに、必要なサーバントを起動できるようになります。サーバが起動時にすべてのオブジェクトをロードする場合は、サーバントマネージャは必要ありません。

サーバントマネージャ は、アプリケーション開発者が POA と関連付けることができるコールバックオブジェクトです。ORB はサーバントマネージャの操作を呼び出して、必要に応じてサーバントを起動したり停止したりします。サーバントマネージャには、オブジェクト ID 値で特徴づけられるオブジェクト参照と特定のサーバントの関連を管理し、オブジェクト参照が存在するかどうかを決定する機能があります。各型のサーバントマネージャは 2 つの操作を実行できます。1 つはサーバントを見つけて返すための操作で、もう 1 つはサーバントを停止するための操作です。操作は、その状況で使用できる情報の量によって異なります。

サーバントマネージャを使用するには、USE_SERVANT_MANAGER ポリシーを設定する必要があります。このポリシーを設定すると、POA 内のほかのポリシーに応じて、特定の状況で使用されるサーバントマネージャの型が決まります。サーバントマネージャには次の 2 つの型があります。

サーバントマネージャの詳細については、CORBA 2.3.1 仕様のセクション 11.3.4 を参照してください。

POA に関する質問と回答

POA を新しく作成する場合に POAManager.activate() が必要ですか。

POA::createPOA に対する POAManager パラメータとして null を渡す場合は、新しく POA を作成するときに POAManager.activate() が必要です。null を渡すと、新しい POAManager が作成され、作成される POA に関連付けられます。この場合は、POAManager.activate() が必要です。

同じ POAManager を使用して複数の POA を制御するには、次の手順を実行します。

  1. POA を作成するかまたは rootPOA を使用します。
  2. POA::the_POAManager を使用して POA のマネージャを取得します。
  3. そのあとの createPOA の呼び出しに POAManager を渡します。

プログラマが上記のように明示的にプログラミングしないかぎり、ルート POA の POAManager とほかの POA の間に暗黙的な関係は存在しません。

詳細については、CORBA specification, formal/99-10-07 のセクション 11.3.2 を参照してください。

詳細情報

ポータブルオブジェクトアダプタについては、Object Management Group のサイトにある CORBA/IIOP v2.3.1 仕様の第 11 章を参照してください。このドキュメントの執筆時点では、仕様は http://www.omg.org/docs/formal/99-10-07.pdf からダウンロードできます。


Java IDL トップへ