28.1.1 サンプルについて

Borland Enterprise Server VisiBrokerをインストールしたディレクトリのexamples/vbe/boa/boa2poaに,BOAをそれに対応するPOAコードに更新する場合のサンプルが入っています。

このサンプルでは,Server.C(C++),Server.java(Java)のBOAコードは次の手順によってPOAに更新されています。

<この項の構成>
(1) ルートPOAのリファレンスの取得
(2) POAポリシーの設定
(3) サーバントの定義
(4) POAマネージャの起動
(5) 入力リクエスト待ち
(6) ほかのファイルについて(C++およびJava)

(1) ルートPOAのリファレンスの取得

C++の場合
BOAを使用する際に,BOAのリファレンスはorb->BOA_init()メソッドによって取得しました。
しかし,POAではルートPOAのリファレンスを取得します。これは,orb->resolve_initial_references("RootPOA")メソッドを使用して行います。resolve_initial_referencesは,CORBA::object型の値を返します。そしてこの値を目的のタイプにナロウします。
コードサンプル28-1 rootPOAのリファレンスの取得(C++)

CORBA::object_var obj = resolve_initial_references("RootPOA");
PortableServer::POA_var rootPOA =
     PortableServer::POA::_narrow(obj);

Javaの場合
BOAを使用する際に,BOAのリファレンスはorb.BOA_init()メソッドによって取得しました。
しかし,POAではルートPOAのリファレンスを取得します。これは,orb.resolve_initial_references("RootPOA")メソッドを使用して行います。resolve_initial_referencesは,CORBA.object型の値を返します。そしてこの値を目的のタイプにナロウします。
コードサンプル28-2 rootPOAのリファレンスの取得(Java)

POA rootPOA = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));

(2) POAポリシーの設定

POAの特性は,そのPOAのポリシーセットによって定義されます。各POAには,独自のポリシーのセットがあります。POAは,ほかのPOAからのポリシーを継承できません。

ここに示すサンプルでは,パーシステントオブジェクトが使用されています。BOAでは,パーシステントオブジェクトには特定のインスタンス名があり,スマートエージェントに登録されるものです。

一つのBOAはパーシステントオブジェクトとトランジェントオブジェクトの両方をサポートできます。POAでは,パーシステントオブジェクトはパーシステントオブジェクトを生成するプロセスを残したものです。一つのPOAはパーシステントオブジェクトもトランジェントオブジェクトもサポートしますが,両方をサポートすることはできません。サポートされるオブジェクトタイプは,POAポリシーによって設定されます。ルートPOAはトランジェントオブジェクトを(デフォルトで)サポートするので,パーシステントオブジェクトをサポートするために新しいPOAを作成する必要があります。

POAのポリシーをいったん生成したら変更することはできません。

パーシステントオブジェクトをサポートするには,ライフスパンポリシーをPERSISTENTに設定します。これは,C++とJavaの両方に適用されます。

C++またはJavaの場合
ここに示すサンプルでは,バインドサポートポリシー(Borland Enterprise Server VisiBroker固有ポリシー)をBY_INSTANCEに設定します。このポリシーは,すべてのアクティブなオブジェクトをPOA(デフォルト)だけでなくスマートエージェントに登録しています。
適切なポリシーを設定したら,新しいPOAがcreate_POA()メソッドで生成できます。
コードサンプル28-3 POAポリシーの設定(C++)

CORBA::PolicyList policies;
  policies.length(1);

  policies [(CORBA::ULong)0] =
        rootPOA->create_lifespan_policy(
        PortableServer::PERSISTENT);

  // Create myPOA with the right policies
  PortableServer::POAManager_var mgr =
        rootPOA->the_POAManager();
  PortableServer::POA_var myPOA =
        rootPOA->create_POA(
        "bank_agent_poa", mgr, policies );

コードサンプル28-4 POAポリシーの設定(Java)

org.omg.CORBA.Any any = orb.create_any();
  BindSupportPolicyValueHelper.insert(any,
                        BindSupportPolicyValue.BY_INSTANCE);
  org.omg.CORBA.Policy bsPolicy =
    orb.create_policy(com.inprise.vbroker.PortableServerExt.
        BIND_SUPPORT_POLICY_TYPE.value, any);

  org.omg.CORBA.Policy[ ] policies ={
     rootPOA.create_lifespan_policy(LifespanPolicyValue.
        PERSISTENT), bsPolicy};
     // Create myPOA with the right policies
     POA myPOA = rootPOA.create_POA("bank_agent_poa",
                       rootPOA.the_POAManager(), policies);

(3) サーバントの定義

BOAでは,サーバントがCORBAオブジェクトです。ここに示すサンプルでは,アカウントマネージャオブジェクトが生成されてから,obj_is_ready()メソッドでエクスポートされます。

POAでは,サーバントはプログラミングオブジェクトで,これはabstractオブジェクトのインプリメンテーションを提供します。サーバントはCORBAオブジェクトではありません。POAシナリオ下では,サーバントが生成されてから固有IDで起動されます。このIDを使ってオブジェクトリファレンスを取得できます。

コードサンプル28-5 サーバントの定義および起動(C++)

// Create the servant
  AccountManagerImpl *managerServant =
        new AccountManagerImpl;
// Decide on the ID for the servant
  PortableServer::ObjectId_var managerId =
     PortableServer::string_to_ObjectId("BankManager");
// Activate the servant with the ID on myPOA
  myPOA->activate_object_with_id(managerId,managerServant);

コードサンプル28-6 サーバントの定義および起動(Java)

// Create the servant
  AccountManagerImpl managerServant =
                                   new AccountManagerImpl();
// Decide on the ID for the servant
  byte[ ] managerId = "BankManager".getBytes();
// Activate the servant with the ID on myPOA
  myPOA.activate_object_with_id(managerId, managerServant);

(4) POAマネージャの起動

POAマネージャはPOAがリクエストをどのように処理するかを制御するオブジェクトです。デフォルトで,POAマネージャは待機状態で生成されます。この状態では,すべてのリクエストは待機キューにルーティングされ,処理はされません。リクエストをディスパッチするには,POAに対応するPOAマネージャを待機状態からアクティブ状態に変更する必要があります。

これは,POAで必要な新しい手順です。BOAと同じ手順ではありません。

コードサンプル28-7 POAマネージャの起動
C++の場合

rootPOA->the_POAManager()->activate();

Javaの場合

rootPOA.the_POAManager().activate();

(5) 入力リクエスト待ち

BOAでは,クライアントからのリクエストを待つためにimpl_is_ready()メソッドが呼び出されます。

POAでは,orb->run()(C++)またはorb.run()(Java)を使用します。

コードサンプル28-8 入力リクエスト待ち
C++の場合

orb->run();

Javaの場合

orb.run();

(6) ほかのファイルについて(C++およびJava)

AccountImplおよびAccountManagerImplクラスの変更事項は,ほぼ新しいクラスの指定を行うことだけです。