28.1.1 サンプルについて
Borland Enterprise Server VisiBrokerをインストールしたディレクトリのexamples/vbe/boa/boa2poaに,BOAをそれに対応するPOAコードに更新する場合のサンプルが入っています。
このサンプルでは,Server.C(C++),Server.java(Java)のBOAコードは次の手順によってPOAに更新されています。
-
BOAを初期化する代わりにルートPOAのリファレンスを取得する
-
BOA特性を模造するために適切なPOAポリシーを設定する
-
サーバントを定義する(POAにはBOAとは異なるサーバントの定義があります)
-
POAマネージャを起動する(BOAと異なる手順)
-
boa->impl_is_ready()メソッド(C++)またはboa.impl_is_ready()メソッド(Java)の代わりにorb->run()メソッド(C++)またはorb.run()メソッド(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クラスの変更事項は,ほぼ新しいクラスの指定を行うことだけです。