<目次>
(1) CORBA通信のPOA(Portable Object Adapter)とは?
(1-1) 概要と特徴
(1-2) 一般的なPOAの処理構成
(1-3) POAのサンプルプログラム例
(1-4) 参考文献
(1) CORBA通信のPOA(Portable Object Adapter)とは?
(1-1) 概要と特徴
(1-2) 一般的なPOAの処理構成
●STEP1:【◎必須】「ルートPOA」の取得
//# ORBインスタンスの生成&初期化 ORB orb = ORB.init( args, null ); //# POAインスタンスの生成&初期化 POA rootPOA = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
public static POA narrow(Object obj)
●STEP2:【△任意】「POA」のポリシー定義
スレッド | (概要) 生成されたPOAに適用するスレッド処理方式を指定。 (選択肢) |
ライフスパン | (概要) POAで実装されたオブジェクトのライフスパンの設定 (選択肢) |
Policy[] tpolicy = new Policy[4]; tpolicy[0] = rootPOA.create_thread_policy(ThreadPolicyValue.ORB_CTRL_MODEL) tpolicy[1] = rootPOA.create_lifespan_policy(LifespanPolicyValue.TRANSIENT ); tpolicy[2] = rootPOA.create_request_processing_policy(RequestProcessingPolicyValue.USE_ACTIVE_OBJECT_MAP_ONLY ); tpolicy[3] = rootPOA.create_servant_retention_policy(ServantRetentionPolicyValue.RETAIN);
●STEP3:【△任意】「POA」の生成
create_POA(String ①アダプタ名, POAManager ②紐付けるPOAマネージャー, Policy[] ③ポリシー定義)
●STEP4:【◎必須】「POAManager」の起動
POA rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA")); rootpoa.the_POAManager().activate();
●STEP5:【△任意】サーバントのアクティブ化
・activate_object_with_id (サーバーアプリ内で使用)
・set_servant_manager (POA内で使用)
●STEP6:【◎必須】POAからオブジェクト参照の生成
//# サーバント(helloImple)からオブジェクト参照を取得 org.omg.CORBA.Object ref = rootpoa.servant_to_reference(helloImpl); Hello href = HelloHelper.narrow(ref); //# ルートネーミングコンテキストの取得 org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef); //# オブジェクト参照とネーミングをバインド(紐付け) String name = "Hello"; NameComponent path[] = ncRef.to_name( name ); ncRef.rebind(path, href);
(1-3) POAのサンプルプログラム例
import SampleApp.*; import org.omg.CosNaming.*; import org.omg.CosNaming.NamingContextPackage.*; import org.omg.CORBA.*; import org.omg.PortableServer.*; import org.omg.PortableServer.POA; import java.util.Properties; //# サーバントのクラス(クライアントから要求される処理の実装クラス) class HelloImpl extends HelloPOA { private ORB orb; public void setORB(ORB orb_val) { orb = orb_val; } public String sayHello() { return "\nHello world !!\n"; } public void shutdown() { orb.shutdown(false); } } public class HelloServer { public static void main(String args[]) { try{ // #### STEP1:【◎必須】「ルートPOA」の取得 ORB orb = ORB.init(args, null); // #### STEP4:【◎必須】「POAManager」の起動 POA rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA")); rootpoa.the_POAManager().activate(); // #### STEP6:【◎必須】POAからオブジェクト参照の生成 HelloImpl helloImpl = new HelloImpl(); helloImpl.setORB(orb); org.omg.CORBA.Object ref = rootpoa.servant_to_reference(helloImpl); Hello href = HelloHelper.narrow(ref); org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef); String name = "Hello"; NameComponent path[] = ncRef.to_name( name ); ncRef.rebind(path, href); System.out.println("HelloServer ready and waiting ..."); orb.run(); } catch (Exception e) { System.err.println("ERROR: " + e); e.printStackTrace(System.out); } System.out.println("HelloServer Exiting ..."); } }