ページの先頭行へ戻る
Interstage Application Server アプリケーション作成ガイド(CORBAサービス編)

4.3.3 サーバアプリケーションと環境設定との関連付け

  インプリメンテーション情報を登録するためのOD_impl_instコマンドとネーミングサービスへ登録するためのOD_or_admコマンドがあります。
  ここでは、サーバアプリケーションとOD_impl_instコマンド、OD_or_admコマンドとの関連付けについて説明します。


4.3.3.1 インプリメンテーション情報との関連付け

  POAオブジェクトを使用したサーバアプリケーションを動作させるためには、OD_impl_instコマンドに指定したインプリメンテーションリポジトリIDとの関連付けを行う必要があります。この関連付けを行うには以下の2とおりの方法があります。

  (1)の方法は、プログラムの外からインプリメンテーションリポジトリIDを指定できるのでプログラムの独立性が高まります。(2)の方法は、プログラムごとの環境変数の指定が不要であり、環境設定が容易となります。


(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を使用することで可能となります。


4.3.3.2 オブジェクトリファレンスの生成方法

  オブジェクトリファレンスの生成およびネーミングサービスへの登録には、以下の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オブジェクトのオブジェクトリファレンスは、事前生成で作成しています。


4.3.3.3 POA使用方法例

  サーバアプリケーションが上記のどちらの方法を使用するかによりPOAオブジェクトの構成方法が異なります。上記のそれぞれの場合について、POAオブジェクトの使用方法を説明します。


POAオブジェクト使用方法1:動的生成/環境変数OD_IMPLID使用



  POAオブジェクトの構成方法として一般的な方法です。

  1. POAを生成(任意のアダプタ名)します。

  2. 指定したインタフェースをもつオブジェクトリファレンスを、create_referenceメソッドで生成します。

  3. Servantを作成します。

  4. 生成したオブジェクトリファレンスのオブジェクトIDを取得します。

  5. ServantのインスタンスとオブジェクトIDの関連付けをPOAのAOMに登録します(活性化)。

  6. ネーミングサービスへオブジェクトリファレンスを登録(bind)します。

  上図では、インタフェースリポジトリID“IDL:Intfid1:1.0”のインタフェースをもつオブジェクトのインスタンスはPOA1オブジェクト(RootPOA)上で管理され、インタフェースリポジトリID“IDL:Intfid2:1.0”のインタフェースをもつオブジェクトのインスタンスはPOA2オブジェクト(子または子孫POAオブジェクト)上で管理されます。

  RootPOAオブジェクトで複数のオブジェクトを管理することも可能ですが、上記のような構成とすることにより、インタフェースごとに異なるPOAポリシで管理することが可能となります。

  アプリケーションを作成する場合は、create_reference()の代わりに、同じくPOAオブジェクトのメソッドであるservant_to_reference()を使用すると便利です。

  1. POAを生成します(任意のアダプタ名)。

  2. Servantを作成します。

  3. servant_to_reference()を発行し、オブジェクトリファレンスを取得します。

  4. ネーミングサービスへオブジェクトリファレンスを登録(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オブジェクトの活性化は、以下のように行います。

  1. Servantオブジェクトを作成します。

  2. 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オブジェクトで行われます。