<目次>
(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 ...");
}
}