インプリメンテーション情報を登録するためのOD_impl_instコマンドとネーミングサービスへ登録するためのOD_or_admコマンドがあります。
ここでは、サーバアプリケーションとOD_impl_instコマンド/OD_or_admコマンドとの関連付けについて説明します。
POAオブジェクトを使用したサーバアプリケーションを動作させるためには、OD_impl_instコマンドに指定したインプリメンテーションリポジトリIDとの関連付けを行う必要があります。この関連付けを行うには、以下の2とおりの方法があります。
環境変数OD_IMPLIDへの指定
プログラムの外からインプリメンテーションリポジトリIDを指定できるのでプログラムの独立性が高まります。
POAオブジェクトのアダプタ名への指定
プログラムごとの環境変数の指定が不要であり、環境設定が容易となります。
(1)環境変数OD_IMPLIDへの指定
サーバアプリケーションの実行環境では、環境変数OD_IMPLIDへインプリメンテーションリポジトリID名を設定することで可能となります。
例
バッチファイル(xxx.bat)でサーバアプリケーションを起動する場合
set OD_IMPLID=Implid1 ← OD_IMPLIDにインプリメンテーションリポジトリ設定 : simple_s.exe ← サーバアプリケーションを起動
シェルでサーバアプリケーションを起動する場合
OD_IMPLID=Implid1 ← OD_IMPLIDにインプリメンテーションリポジトリ設定 export OD_IMPLID : simple_s ← サーバアプリケーションを起動
(2)POAオブジェクトのアダプタ名への指定
環境変数OD_IMPLIDを設定しないで、アプリケーション上でPOAオブジェクトとインプリメンテーション情報との関連付けを明示的に行うことが可能です。この方式では、RootPOAオブジェクト直下の子POAオブジェクトのアダプタ名にインプリメンテーションリポジトリIDを使用することで可能となります。
オブジェクトリファレンスの生成およびネーミングサービスへの登録には、以下の2とおりの方法があります。
動的生成
事前生成
POAオブジェクト上(サーバアプリケーション内)でPOAオブジェクトのcreate_reference()メソッドにより実行時に生成します。作成したオブジェクトリファレンスは アプリケーション内でネーミングサービスへ登録するか、またはパラメタとしてクライアントアプリケーションに通知することにより、クライアントアプリケーションへ渡されます。
この方法はクライアントからの要求ごとにオブジェクトリファレンスを作成できるため、クライアントごとのインスタンス管理を動的に行うことができます。
“4.3.1.2 各アプリケーション形態”に示す「Factory-1方式」、「Factory-2方式」、「ユーザインスタンス管理法式」のServantオブジェクトのオブジェクトリファレンスは、動的生成で作成しています。
なお、オブジェクトリファレンスの動的生成方法については、“4.3.2.4 オブジェクトリファレンスの生成”を参照してください。
OD_or_admコマンドを使用し、事前にオブジェクトリファレンスの生成とネーミングサービスへの登録を行います。
この方法は事前にオブジェクトリファレンスを登録しておくため、動的生成に比較して性能/資源面で優れています。
“4.3.1.2 各アプリケーション形態”に示す「デフォルトインスタンス方式」のServantオブジェクトのオブジェクトリファレンス、および「Factory-1方式」、「Factory-2方式」、「ユーザインスタンス管理法式」のFactoryオブジェクトのオブジェクトリファレンスは、事前生成で作成しています。
サーバアプリケーションが上記のどちらの方法を使用するかにより、POAオブジェクトの構成方法が異なります。上記のそれぞれの場合について、POAオブジェクトの使用方法を説明します。
POAオブジェクト使用方法1:動的生成/環境変数OD_IMPLID使用
POAオブジェクトの構成方法として一般的な方法です。
POAを生成(任意のアダプタ名)します。
create_referenceメソッドで、指定したインタフェースをもつオブジェクトリファレンスを生成します。
Servantを作成します。
生成したオブジェクトリファレンスのオブジェクトIDを取得します。
POAのAOMに、ServantのインスタンスとオブジェクトIDの関連付けを登録します(活性化)。
ネーミングサービスへオブジェクトリファレンスを登録(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オブジェクトで行われます。