アプリケーション開発者は、新しい POA を作成するときに、新しい POA 用に選択した特定のポリシーを宣言し、異なるアダプタアクティベータおよびサーバントマネージャ (これらは、必要に応じて POA の起動やサーバントの起動を行うために POA が使用するコールバックオブジェクト) を提供できます。オブジェクト ID は POA に対して相対的に解釈されるため、アプリケーション開発者は、新しい POA を作成することによってさらにオブジェクトの名前空間の区分けも行うことができます。また、新しい POA を作成すると、開発者は、複数のオブジェクトのセットに対する要求の処理を個別に制御できます。
アダプタアクティベータはオプションです。アダプタアクティベータは、要求の処理中に POA を作成する必要がある場合に使用します。アプリケーションの初期化時に、必要な POA がすべて作成されている場合は、アダプタアクティベータは必要ありません。
アダプタアクティベータを使用すると、POA は、必要に応じて子 POA を作成できるようになります。子 POA の作成は、子 POA (または複数の子のいずれか) を指定した要求を受信したときの副作用として実行されるか、あるいは起動パラメータ値 TRUE を使用して find_POA
メソッドが呼び出されたときに実行されます。ORB は、存在していない子 POA への要求を受け取ると、アダプタアクティベータの操作を呼び出します。アダプタアクティベータは必要な POA をその場で作成します。
要求は、ターゲットオブジェクトのオブジェクト ID と、ターゲットオブジェクト参照を作成した POA の識別情報を伝達できる必要があります。クライアントから要求が発行されると、ORB は、初めに適切なサーバを探し (必要な場合は起動する)、次にそのサーバ内で適切な POA を探します。
サーバプロセス内に POA が存在しない場合、アプリケーションは、アダプタアクティベータを使用して必要な POA を再作成することができます。アダプタアクティベータは、ユーザによって実装されるオブジェクトで、POA に関連付けることができます。アダプタアクティベータは、存在していない POA への要求を受け取ったときに、ORB によって呼び出されます。ここでアダプタアクティベータに、必要な POA を作成する機会が与えられます。アダプタアクティベータが POA を作成しない場合、クライアントは ADAPTER_NONEXISTENT
例外を受け取ります。
ORB は、必要な POA を見つけると、その POA に要求を渡します。そのあとの要求の処理は、POA に関連付けられているポリシーと、オブジェクトの現在の起動状態によって異なります。
次のコードは、要求の処理中に POA を作成できるようにするためにアダプタアクティベータを使用するアプリケーションの例を示しています。このアプリケーションは、「Hello World」の例を基にして作成したものです。この例には次のファイルが含まれています。
この例を実行する方法については、「アダプタアクティベータのアプリケーション例の実行」を参照してください。
サンプルクライアントのためのコードで、ORB を初期化し、HelloServant
を解釈処理し、sayHello() メソッドを呼び出します。
//Client.java import org.omg.CORBA.ORB; import org.omg.CosNaming.NamingContext; import org.omg.CosNaming.NamingContextHelper; import org.omg.CosNaming.NameComponent; public class Client { public void run(String[] args) { try { //initialize the orb ORB orb = ORB.init(args, null); System.out.println("ORB initialized"); NamingContext namingContext = NamingContextHelper.narrow( orb.resolve_initial_references("NameService")); NameComponent[] nc = { new NameComponent("HelloServer", "") }; //resolve HelloServant and invoke sayHello() Hello helloRef = HelloHelper.narrow(namingContext.resolve(nc)); System.out.println("Resolved HelloServant"); System.out.println(helloRef.sayHello()); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { new Client().run(args); } }
サーバーのためのコードで、次のような処理を行います。
//Server.java import org.omg.CORBA.ORB; import org.omg.CORBA.LocalObject; import org.omg.CORBA.Policy; import org.omg.PortableServer.POA; import org.omg.PortableServer.POAHelper; import org.omg.PortableServer.AdapterActivator; import org.omg.PortableServer.IdAssignmentPolicyValue; import org.omg.PortableServer.LifespanPolicyValue; import org.omg.PortableServer.ImplicitActivationPolicyValue; import org.omg.CosNaming.NamingContext; import org.omg.CosNaming.NamingContextHelper; import org.omg.CosNaming.NameComponent; public class Server { public void run(String[] args) { try { //initialize the orb ORB orb = ORB.init(args, null); System.out.println("ORB initialized"); //resolve RootPOA POA rootPOA = POAHelper.narrow( orb.resolve_initial_references("RootPOA")); //register adapter activator with rootPOA so that child POAs can //be created on demand rootPOA.the_activator(new MyAdapterActivator()); //find_POA with an activate parameter TRUE would cause the //adapter activator associated with rootPOA to be invoked if //'HelloPOA' does not exist POA childPOA = rootPOA.find_POA("HelloPOA", true); //Create the object reference for HelloServant //and register with naming service org.omg.CORBA.Object obj = childPOA.id_to_reference( "abcd".getBytes()); Hello helloRef = HelloHelper.narrow(obj); NamingContext namingContext = NamingContextHelper.narrow( orb.resolve_initial_references("NameService")); NameComponent[] nc = { new NameComponent("HelloServer", "") }; namingContext.rebind(nc, helloRef); //Destroy 'HelloPOA'. This POA will be transparently recreated when //ORB receives a request on HelloPOA using the adapter activator we //registered with the RootPOA childPOA.destroy(true, true); //activate rootPOA rootPOA.the_POAManager().activate(); //wait for incoming requests System.out.println("Server ready and running...."); orb.run(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { new Server().run(args); } } class MyAdapterActivator extends LocalObject implements AdapterActivator { public boolean unknown_adapter(POA parent, String name) { System.out.println("unknown_adapter() invoked for POA - " + name); try { // create the POA with appropriate policies // this sample uses PERSISTENT, NO_IMPLICIT_ACTIVATION // and USER_ID policies Policy[] policy = new Policy[3]; policy[0] = parent.create_lifespan_policy( LifespanPolicyValue.PERSISTENT); policy[1] = parent.create_id_assignment_policy( IdAssignmentPolicyValue.USER_ID); policy[2] = parent.create_implicit_activation_policy( ImplicitActivationPolicyValue.NO_IMPLICIT_ACTIVATION); POA child = parent.create_POA(name, null, policy); //Associate the servant with the new POA HelloServant hello = new HelloServant(); child.activate_object_with_id("abcd".getBytes(), hello); //activate the new POA child.the_POAManager().activate(); return true; } catch (Exception e) { e.printStackTrace(); } return false; } }
interface Hello { string sayHello(); };
//HelloServant.java public class HelloServant extends HelloPOA { public String sayHello() { return "Hello :)"; } }
make プログラムは、UNIX シェルが実行する一連のコマンドを生成します。
JAVA_HOME=<path_to_your_Java_installation_bin_directory> #setup tools JAVA=$(JAVA_HOME)/bin/java JAVAC=$(JAVA_HOME)/bin/javac IDLJ=$(JAVA_HOME)/bin/idlj ORBD=$(JAVA_HOME)/bin/orbd all : clean build run clean : - rm -rf classes orb.db build : mkdir -p classes $(IDLJ) -fall -td classes Hello.idl $(JAVAC) -classpath classes -d classes HelloServant.java Server.java Client.java run : runorbd register runclient runorbd : $(ORBD) -ORBInitialPort 10001 & sleep 20 register: #servertool does not support script based register due to a bug #using class instead #Please note that the name of theservertool
#class may change in future releases. $(JAVA) com.sun.corba.se.internal.Activation.ServerTool \ -ORBInitialPort 10001 -cmd \ register -server Server -classpath classes runclient : $(JAVA) -classpath classes Client -ORBInitialPort 10001
bat ユーティリティは、Microsoft Windows のコマンドシェルが実行する一連のコマンドを生成します。
SET JAVA_HOME=<path_to_your_Java_installation_build_directory> mkdir classes %JAVA_HOME%\bin\idlj -fall -td classes Hello.idl %JAVA_HOME%\bin\javac -classpath classes -d classes HelloServant.java Server.java Client.java REM - Start the ORB daemon start %JAVA_HOME%\bin\orbd -ORBInitialPort 10001 -ORBDebug orbd @echo Wait 10-15 seconds for the orbd to start @pause REM - Register the persistent server with orbd using servertool REM - Please note that the name of theservertool
REM - class may change in future releases. %JAVA_HOME%\bin\java com.sun.corba.se.internal.Activation.ServerTool -ORBInitialPort 10001 -cmd register -server Server -classpath classes %JAVA_HOME%\bin\java -classpath classes Client -ORBInitialPort 10001
この例を実行するには、次のようにします。
Makefile を実行すると、端末ウィンドウに次の例のような出力が表示されます。
この例を実行し終えたら、ORDB をシャットダウンします。
rm -rf classes orb.db mkdir -p classes /j2sdk1.5.0/bin/idlj -fall -td classes Hello.idl /j2sdk1.5.0/bin/javac -classpath classes -d classes HelloServant.java Server.java Client.java /j2sdk1.5.0/bin/orbd -ORBInitialPort 10001 & sleep 20 #servertool does not support script based register due to a bug #using class instead #Please note that the name of theservertool
#class may change in future releases. /j2sdk1.5.0/bin/java com.sun.corba.se.internal.Activation.ServerTool \ -ORBInitialPort 10001 -cmd \ register -server Server -classpath classes server registered (serverid = 257). /j2sdk1.5.0/bin/java -classpath classes Client -ORBInitialPort 10001 ORB initialized Resolved HelloServant Hello :)
pkill orbd
と入力
Ctrl+C
と入力
アダプタアクティベータの詳細については、CORBA 2.3.1 仕様の 11.3.3 項または「AdapterActivatorOperations API のドキュメント」を参照してください。
Java IDL トップへ |
[an error occurred while processing this directive]