Borland Enterprise Server VisiBrokerをインストールしたディレクトリのexamples/vbe/boa/boa2poaに,BOAをそれに対応するPOAコードに更新する場合のサンプルが入っています。
このサンプルでは,Server.C(C++),Server.java(Java)のBOAコードは次の手順によってPOAに更新されています。
CORBA::object_var obj = resolve_initial_references("RootPOA");
PortableServer::POA_var rootPOA =
PortableServer::POA::_narrow(obj);
POA rootPOA = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
POAの特性は,そのPOAのポリシーセットによって定義されます。各POAには,独自のポリシーのセットがあります。POAは,ほかのPOAからのポリシーを継承できません。
ここに示すサンプルでは,パーシステントオブジェクトが使用されています。BOAでは,パーシステントオブジェクトには特定のインスタンス名があり,スマートエージェントに登録されるものです。
一つのBOAはパーシステントオブジェクトとトランジェントオブジェクトの両方をサポートできます。POAでは,パーシステントオブジェクトはパーシステントオブジェクトを生成するプロセスを残したものです。一つのPOAはパーシステントオブジェクトもトランジェントオブジェクトもサポートしますが,両方をサポートすることはできません。サポートされるオブジェクトタイプは,POAポリシーによって設定されます。ルートPOAはトランジェントオブジェクトを(デフォルトで)サポートするので,パーシステントオブジェクトをサポートするために新しいPOAを作成する必要があります。
パーシステントオブジェクトをサポートするには,ライフスパンポリシーをPERSISTENTに設定します。これは,C++とJavaの両方に適用されます。
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 );
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);
BOAでは,サーバントがCORBAオブジェクトです。ここに示すサンプルでは,アカウントマネージャオブジェクトが生成されてから,obj_is_ready()メソッドでエクスポートされます。
POAでは,サーバントはプログラミングオブジェクトで,これはabstractオブジェクトのインプリメンテーションを提供します。サーバントはCORBAオブジェクトではありません。POAシナリオ下では,サーバントが生成されてから固有IDで起動されます。このIDを使ってオブジェクトリファレンスを取得できます。
// 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);
// 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);
POAマネージャはPOAがリクエストをどのように処理するかを制御するオブジェクトです。デフォルトで,POAマネージャは待機状態で生成されます。この状態では,すべてのリクエストは待機キューにルーティングされ,処理はされません。リクエストをディスパッチするには,POAに対応するPOAマネージャを待機状態からアクティブ状態に変更する必要があります。
これは,POAで必要な新しい手順です。BOAと同じ手順ではありません。
rootPOA->the_POAManager()->activate();
rootPOA.the_POAManager().activate();
BOAでは,クライアントからのリクエストを待つためにimpl_is_ready()メソッドが呼び出されます。
POAでは,orb->run()(C++)またはorb.run()(Java)を使用します。
orb->run();
orb.run();
AccountImplおよびAccountManagerImplクラスの変更事項は,ほぼ新しいクラスの指定を行うことだけです。