POAオブジェクトの構成は、サーバアプリケーションの実装において以下の方法をどのような組合せで使用するかにより異なります。
インプリメンテーションリポジトリIDとの関連付けの方法(“5.14.1 インプリメンテーション情報との関連付け”を参照)
環境変数OD_IMPLID使用(環境変数OD_IMPLIDへの指定)
環境変数OD_IMPLID未使用(POAオブジェクトのアダプタ名への指定)
オブジェクトリファレンスの生成方法(“5.14.2 オブジェクトリファレンスの生成方法”を参照)
動的生成
事前生成
それぞれの組合せについて、POAオブジェクトの使用方法と構成を説明します。
■POAオブジェクト使用方法1:動的生成/環境変数OD_IMPLID使用
一般的なPOAオブジェクトの構成です。
POAを生成(任意のアダプタ名)します。
指定したインタフェースをもつオブジェクトリファレンスをcreate_referenceメソッドで生成します。
Servantを作成します。
生成したオブジェクトリファレンスのオブジェクトIDを取得します。
ServantのインスタンスとオブジェクトIDの関連付けをPOAのAOMに登録します(活性化)。
ネーミングサービスへオブジェクトリファレンスを登録(bind)します。
上図では、インタフェースリポジトリID“IDL:Intfid1:1.0”のインタフェースをもつオブジェクトのインスタンスはPOA1オブジェクト(RootPOA)上で管理され、インタフェースリポジトリID“IDL:Intfid2:1.0”のインタフェースをもつオブジェクトのインスタンスはPOA2オブジェクト(子または子孫POAオブジェクト)上で管理されます。
RootPOAオブジェクトで複数のオブジェクトを管理することも可能ですが、上記のような構成とすることにより、インタフェースごとに異なるPOAポリシで管理することが可能となります。
アプリケーションを作成する場合はcreate_reference()の代わりに、同じくPOAオブジェクトのメソッドであるservant_to_reference()を使用すると便利です。
POAを生成します(任意のアダプタ名)。
Servantを作成します。
servant_to_reference()を発行し、オブジェクトリファレンスを取得します。
ネーミングサービスへオブジェクトリファレンスを登録(bind)します。
servant_to_reference()の結果、POAオブジェクトにServantオブジェクトとオブジェクトIDの関連付けの登録(活性化)が行われ、さらにオブジェクトIDを内包するオブジェクトリファレンスが返されます。ServantオブジェクトはインタフェースリポジトリIDを内包しているため、create_reference()を使用した場合のように明示的に指定する必要がありません。また、オブジェクトIDは活性化時に自動生成されるため、意識する必要はありません。ただし、POAポリシにIMPLICIT_ACTIVATIONを指定する必要があります。
■POAオブジェクト使用方法2:事前生成/環境変数OD_IMPLID使用
この構成は、OD_or_admコマンドを使用し、オブジェクトリファレンスの生成とネーミングサービスへの登録を事前に行っている場合に使用します。インタフェースリポジトリID“IDL:Intfid1:1.0”のインタフェースをもつオブジェクトを管理するために、「子POAオブジェクト」を生成します。この際に、インタフェースリポジトリIDと同じ文字列(Stringオブジェクト)を設定します。
Servantオブジェクトの活性化は、以下のように行います。
Servantオブジェクトを作成します。
Servantオブジェクトに対応するインタフェースリポジトリIDをアダプタ名としたPOAに対し、activate_object()を発行します。
OD_or_admコマンドによりオブジェクトリファレンスの生成とネーミングサービスへの登録を事前に行っているため、アプリケーション上での生成と登録は必要ありません。
■POAオブジェクト使用方法3:動的生成/環境変数OD_IMPLID未使用
インプリメンテーション情報との関連付けを行うために、アダプタ名にインプリメンテーションリポジトリIDを指定し、RootPOAオブジェクトに対する子POAオブジェクトを作成します。
次に、孫(またはその子孫)POAオブジェクトを作成し(アダプタ名は任意)、そのPOAオブジェクト上でcreate_reference()メソッドやservant_to_reference()メソッドを使用してオブジェクトリファレンスを作成します。
Servantオブジェクトの活性化後、オブジェクトのインスタンス管理は、この孫(またはその子孫)POAオブジェクト上で行われます。この構成の場合、RootPOAオブジェクトでは、インスタンス管理を行うことはできません。
■POAオブジェクト使用方法4:事前生成/環境変数OD_IMPLID未使用
インプリメンテーション情報との関連付けを行うためには、上図の左側のように3階層でPOAオブジェクトを生成します。このとき、RootPOAオブジェクトの直下の子POAオブジェクト(POA2)は、インプリメンテーションリポジトリIDをアダプタ名に指定して生成します。
次に、子POAオブジェクトのさらに子POAオブジェクト(孫POA:POA3, POA4)は、インタフェースリポジトリIDをアダプタ名に指定して生成します。
この結果、インプリメンテーション情報、インタフェース情報は、上図のようにPOAと関連付けられます。リポジトリID“IDL:Intfid2:1.0”のインタフェースをもつオブジェクトのインスタンス管理は、POA4オブジェクトで行われます。