May 9, 2002 onlsun1, Solaris8システムでのJavaRMI-IIOPの実行 --- hello world実行#1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (http://www-online.kek.jp/~inoue/para-CAMAC/ Test/Hello-JavaRMI-IIOP.html) 高エネルギー加速器研究機構 素粒子原子核研究所 物理、オンライングループ 井上 栄二 (1). 現状確認 (A). S-4/20、onlsun1にjava 1.4.0 がインストールされている。 (2). ここでやるべきこと Solaris8、onlsun1のマシン上でJavaRMI-IIOPでのhello world を実行する。 (3). コンパイル (3-1). Javaのチェック サーバ側 onlsun3[53]% java -version java version "1.4.0" Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0-b92) Java HotSpot(TM) Client VM (build 1.4.0-b92, mixed mode) onlsun3[54]% クライアント側 onlsun1[347]% java -version java version "1.4.0" Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0-b92) Java HotSpot(TM) Client VM (build 1.4.0-b92, mixed mode) onlsun1[348]% (3-2). サーバ側のコンパイル onlsun3[104]% java -version java version "1.4.0" Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0-b92) Java HotSpot(TM) Client VM (build 1.4.0-b92, mixed mode) onlsun3[105]% which javac /bin/javac onlsun3[106]% which rmic /bin/rmic onlsun3[107]% HelloInterface を実装するリモートオブジェクトの実装をコンパイルする。 onlsun3[108]% cat HelloImpl.java //HelloImpl.java import javax.rmi.PortableRemoteObject; public class HelloImpl extends PortableRemoteObject implements HelloInterface { public HelloImpl() throws java.rmi.RemoteException { super(); // invoke rmi linking and remote object initialization } public void sayHello() throws java.rmi.RemoteException { System.out.println( "It works! Hello World!!" ); } } onlsun3[109]% onlsun3[109]% javac -d . -classpath . HelloImpl.java HelloImplリモートオブジェクト実装のスタブおよびスケルトンを作成する。 onlsun3[110]% rmic -poa -iiop HelloImpl onlsun3[111]% 上記のコマンドでよって、 _HelloInterface_Stub.class --- クライアントスタブ _HelloImpl_Tie.class --- サーバスケルトン の2つのファイルが作られた。 リモートインターフェース HelloInterface のインターフェース定義は以下の とおり。 onlsun3[111]% cat HelloInterface.java //HelloInterface.java import java.rmi.Remote; public interface HelloInterface extends java.rmi.Remote { public void sayHello() throws java.rmi.RemoteException; } onlsun3[112]% サーバのソースコード。 onlsun3[112]% cat HelloServer.java //HelloServer.java import javax.naming.InitialContext; import javax.naming.Context; import javax.rmi.PortableRemoteObject; import com.sun.corba.se.internal.POA.POAORB; import org.omg.PortableServer.*; import java.util.*; import org.omg.CORBA.*; import javax.rmi.CORBA.Stub; import javax.rmi.CORBA.Util; public class HelloServer{ public HelloServer(String[] args) { try { Properties p = System.getProperties(); // add runtime properties here p.put("org.omg.CORBA.ORBClass", "com.sun.corba.se.internal.POA.POAORB"); p.put("org.omg.CORBA.ORBSingletonClass", "com.sun.corba.se.internal.corba.ORBSingleton"); ORB orb = ORB.init( args, p ); POA rootPOA = (POA)orb.resolve_initial_references("RootPOA"); // STEP 1: Create a POA with the appropriate policies Policy[] tpolicy = new Policy[3]; tpolicy[0] = rootPOA.create_lifespan_policy( LifespanPolicyValue.TRANSIENT ); tpolicy[1] = rootPOA.create_request_processing_policy( RequestProcessingPolicyValue.USE_ACTIVE_OBJECT_MAP_ONLY ); tpolicy[2] = rootPOA.create_servant_retention_policy( ServantRetentionPolicyValue.RETAIN); POA tPOA = rootPOA.create_POA("MyTransientPOA", null, tpolicy); // STEP 2: Activate the POA Manager, otherwise all calls to the // servant hang because, by default, POAManager will be in the // HOLD state. tPOA.the_POAManager().activate(); // STEP 3: Instantiate the Servant and activate the Tie, If the // POA policy is USE_ACTIVE_OBJECT_MAP_ONLY HelloImpl helloImpl = new HelloImpl(); _HelloImpl_Tie tie = (_HelloImpl_Tie)Util.getTie( helloImpl ); String helloId = "hello"; byte[] id = helloId.getBytes(); tPOA.activate_object_with_id( id, tie ); // STEP 4: Publish the object reference using the same object id // used to activate the Tie object. Context initialNamingContext = new InitialContext(); initialNamingContext.rebind("HelloService", tPOA.create_reference_with_id(id, tie._all_interfaces(tPOA,id)[0]) ); System.out.println("Hello Server: Ready..."); // STEP 5: Get ready to accept requests from the client orb.run(); } catch (Exception e){ System.out.println("Problem running HelloServer: " + e); e.printStackTrace(); } } public static void main(String args[]){ new HelloServer( args ); } } onlsun3[113]% クライアントのソースコード。 onlsun3[113]% cat HelloClient.java //HelloClient.java import java.rmi.RemoteException; import java.net.MalformedURLException; import java.rmi.NotBoundException; import javax.rmi.*; import java.util.Vector; import javax.naming.NamingException; import javax.naming.InitialContext; import javax.naming.Context; public class HelloClient{ public static void main(String args[]){ Context ic; Object objref; HelloInterface hi; try { ic = new InitialContext(); } catch (NamingException e) { System.out.println("failed to obtain context" + e); e.printStackTrace(); return; } // STEP 1: Get the Object reference from the Name Service // using JNDI call. try { objref = ic.lookup("HelloService"); System.out.println("Client: Obtained a ref. to Hello server."); } catch (NamingException e) { System.out.println("failed to lookup object reference"); e.printStackTrace(); return; } // STEP 2: Narrow the object reference to the concrete type and // invoke the method. try { hi = (HelloInterface) PortableRemoteObject.narrow( objref, HelloInterface.class); hi.sayHello(); } catch (ClassCastException e) { System.out.println("narrow failed"); e.printStackTrace(); return; } catch( Exception e ) { System.err.println( "Exception " + e + "Caught" ); e.printStackTrace(); return; } } } onlsun3[114]% サーバ、クライアントおよびリモートインターフェースコードをコンパイル する。 onlsun3[114]% javac -d . -classpath . HelloInterface.java HelloServer.java HelloClient.java onlsun3[115]% (3-3). クライアント側のコンパイル onlsun1[65]% java -version java version "1.4.0" Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0-b92) Java HotSpot(TM) Client VM (build 1.4.0-b92, mixed mode) onlsun1[66]% which javac /bin/javac onlsun1[67]% which rmic /bin/rmic onlsun1[68]% 上記(3-2)と同様のコンパイルをする。 onlsun1[69]% javac -d . -classpath . HelloImpl.java onlsun1[70]% rmic -poa -iiop HelloImpl onlsun1[71]% javac -d . -classpath . HelloInterface.java HelloServer.java HelloClient.java onlsun1[72]% (4). 実行 <<< サーバ側実行 >>> (4-1). ネームサービスを起動する この例では、Object Request Broker Daemon(orbd) を使用する。 onlsun3[116]% orbd -ORBInitialPort 1060 -ORBInitialHost onlsun3 & [1] 551 onlsun3[117]% (4-2). サーバを起動する onlsun3[117]% java -classpath . -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory -Djava.naming.provider.url=iiop://onlsun3:1060 HelloServer & [2] 552 onlsun3[118]% Hello Server: Ready... It works! Hello World!! (4-3). クライアントアプリケーションを起動する <<< クライアント側実行 >>> onlsun1[73]% java -classpath . -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory -Djava.naming.provider.url=iiop://onlsun3:1060 HelloClient & [1] 1703 onlsun1[74]% Client: Obtained a ref. to Hello server. サーバ側は、"It works! Hello World!!" を画面に表示して、正常に実行 できたことを示している。