|
RMI-IIOP プログラマーズガイドCopyright © 1999 Sun Microsystems, Inc.
|
ドキュメントの目次 |
RMI には、ほかの言語との相互運用性はありません。 また、非標準の通信プロトコルを使用しているため、CORBA オブジェクトと通信することができません。
JDK の CORBA/IIOP 実装は、Java IDL と呼ばれています。idltojava コンパイラおよび Java IDL を使用して、Java プログラミング言語から CORBA オブジェクトの定義、実装、およびアクセスを行うことができます。
「Java IDL」 Web ページでは、CORBA/IIOP プログラミングについて Java を中心にわかりやすく説明されています。Java IDL プログラムの作成についての概要は、「入門: Hello World」Web ページを参照してください。
新しい rmic のフラグを次に示します。
-iiop -- IIOP スタブ/Tie を生成する新しい rmic の動作では、出力ディレクトリ (-d オプション) を指定しない場合、以前のバージョンと動作が異なります。JDK では、-d オプションを指定しない場合、パッケージにかかわりなく、スタブおよび Tie ファイルは常に現在の作業用ディレクトリに書き込まれます。新しい rmic では、パッケージに対応する、カレントディレクトリのサブディレクトリにファイルが作成されます。
-idl -- IDL を生成する
-noValueMethods -- IDL の valuetype 内にメソッドとコンストラクタが生成されないようにする
-always -- 既存のスタブ、Tie、または idl が入力クラスより新しいときでも再生成する。-iiop または -idl フラグ (あるいはその両方) が指定されている場合のみ有効
-factory -- ファクトリキーワードを使用する
-idlModule <fromJavaPackage<.class>> <toIDLModule> -- IDLEntity パッケージマッピングを指定する。例: -idlModule foo.bar my::real::idlmod
-idlFile <fromJavaPackage<.class>> <toIDLFile> -- IDLEntity ファイルマッピングを指定する。例: -idlFile test.pkg.X TEST16.idl
スタブクラスは、abstract インタフェースにも生成されます。abstract インタフェースは、java.rmi.Remote は継承していませんが、そのメソッドから java.rmi.RemoteException または java.rmi.RemoteException のスーパークラスがスローされるインタフェースです。また、java.rmi.Remote を継承せず、メソッドが存在しないインタフェースも、abstract インタフェースです。
注: 生成された IDL は、IDL に対する CORBA 2.3 拡張機能がサポートされている IDL コンパイラを使用しないとコンパイルできません。
rmic についての詳細は、RMIC ツールのページ (Solaris 版/Windows 版) を参照してください。
import javax.naming.*; ... Context initialNamingContext = new InitialContext();
import java.rmi.*;
...
Naming.rebind("MyObject", myObj); 次のコードを使用します。 import javax.naming.*;
...
initialNamingContext.rebind("MyObject", myObj);
import java.util.*;
import javax.naming.*;
...
Hashtable env = new Hashtable();
env.put("java.naming.applet", this);
Context ic = new InitialContext(env);
サーバ側では、PortableRemoteObject.toStub() 呼び出しを使用してスタブを取得し、writeObject() を使用してそのスタブを ObjectOutputStream に直列化します。次のコードによって、これらの処理が行われます。
org.omg.CORBA.ORB myORB = org.omg.CORBA.ORB.init(new String[0], null);
Wombat myWombat = new WombatImpl();
javax.rmi.CORBA.Stub myStub = (javax.rmi.CORBA.Stub)PortableRemoteObject.toStub(myWombat);
myStub.connect(myORB);
// myWombat is now connected to myORB. To connect other objects to the
// same ORB, use PortableRemoteObject.connect(nextWombat, myWombat);
FileOutputStream myFile = new FileOutputStream("t.tmp");
ObjectOutputStream myStream = new ObjectOutputStream(myFile);
myStream.writeObject(myStub);
クライアント側では、readObject() を使用して ObjectInputStream から、リモート参照の直列化復元をオブジェクトに行います。 次のコードが使用されます。
FileInputStream myFile = new FileInputStream("t.tmp");
ObjectInputStream myStream = new ObjectInputStream(myFile);
Wombat myWombat = (Wombat)myStream.readObject();
org.omg.CORBA.ORB myORB = org.omg.CORBA.ORB.init(new String[0], null);
((javax.rmi.CORBA.Stub)myWombat).connect(myORB);
// myWombat is now connected to myORB.  To connect other objects to the
// same ORB, use PortableRemoteObject.connect(nextWombat, myWombat);
_<implementionName>_Tie.class _<interfaceName>_Stub.class
tnameservデフォルトのポート番号 900 が使用されます。別のポート番号 (ポート 1050 など) を使用する場合は、ORBInitialPort 修飾子を使用します。
tnameserv -ORBInitialPort 1050
java -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory -Djava.naming.provider.url=iiop://<hostname>:900 <appl_class>この例では、デフォルトのネームサービスのポート番号 900 が使用されています。ステップ 7 で別のポート番号を指定した場合は、プロバイダの URL に、同じポート番号を使用する必要があります。プロバイダの URL の <hostname> は、ステップ 7 で CosNaming サーバを起動したときに使用したホスト名です。
java.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory java.naming.provider.url=iiop://<hostname>:900この例では、デフォルトのネームサービスのポート番号 900 が使用されています。ステップ 7 で別のポート番号を指定した場合は、プロバイダの URL に、同じポート番号を使用する必要があります。プロバイダの URL の <hostname> は、ステップ 7 で CosNaming サーバを起動したときに使用したホスト名です。
RMI の Hello World は、次の要素で構成されています。
RMI の Hello World の例を使用したことがない場合は、使用してみることをお勧めします。例を使用したあとで、次のステップを実行します。
実装クラス (サーバ) を RMI-IIOP に適合させる:
//Goodbye //import java.rmi.server.UnicastRemoteObject; //Hello import javax.rmi.PortableRemoteObject;
import javax.naming.*;
public class HelloImpl extends PortableRemoteObject ...
Context initialNamingContext = new InitialContext();初期 JNDI ネーミングコンテキストが提供されます。 このステップは、クライアント側でも実行する必要があります。
変更前のコード:
HelloImpl obj = new HelloImpl("HelloServer");
Naming.rebind("HelloServer", obj);変更後のコード: HelloImpl obj = new HelloImpl("HelloServer"); //unchanged
initialNamingContext.rebind("HelloServer",obj);
import javax.rmi.PortableRemoteObject;
import java.util.*;
import javax.naming.*;
...
Hashtable env = new Hashtable();
env.put("java.naming.corba.applet", this);
//The next two values will be specifiable
//By applet tag params in future releases
env.put("java.naming.factory.initial",
"com.sun.jndi.cosnaming.CNCtxFactory");
env.put("java.naming.provider.url", "iiop://<hostname>:900");
Context ic = new InitialContext(env);
変更前のコード:
import java.rmi.*;
...
Hello obj = (Hello)Naming.lookup("//" +
getCodeBase().getHost() + "/HelloServer");変更後のコード: import javax.naming.*;
...
Hello obj =
(Hello)PortableRemoteObject.narrow(
initialNamingContext.lookup("HelloServer"),
Hello.class);
次のプロパティを Hello.html アプレットタグに追加します。
<param name="java.naming.factory.initial" value="com.sun.jndi.cosnaming.CNCtxFactory"> <param name="java.naming.provider.url" value="iiop://<hostname>:900">
Java ソースファイルのコンパイル
スタブおよび Tie クラスの生成javac -d $HOME/public_html/codebase Hello.java HelloImpl.java HelloApplet.java
検索パスの $RMI_IIOP_HOME/bin ディレクトリに rmic コマンドが指定されていることを確認します。
Hello_Stub.class (クライアント側のプロキシ) および HelloImpl_Tie.class (サーバ側のプロキシ) ファイルが、$HOME/public_html/codebase/examples/hello ディレクトリに生成されます。rmic -iiop -d $HOME/public_html/codebase examples.hello.HelloImpl
JNDI ネームサーバの起動
JNDI ネームサーバが、デフォルトのポート番号 900 を使用して起動されます。別のポート番号 (Solaris のユーザは、1024 よりも大きいポートを使用すること) を使用する場合は、次のようなコマンド行を使用します。tnameserv
tnameserv -ORBInitialPort 1050
Hello サーバの起動
java -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory -Djava.naming.provider.url=iiop://<hostname>:900 examples.hello.HelloImpl
Hello クライアントの起動
appletviewer を使用して Hello.html をロードします。
Hello.html の内容は、次のとおりです。appletviewer Hello.html
これらの処理が正常終了した場合は、appletviewer によって HelloServer のメッセージが表示されます。<html> <title>Hello World</title> <center> <h1>Hello World</h1> </center> HelloServer からのメッセージ: <p> <applet code="examples.hello.HelloApplet" width=500 height=120> </applet> </HTML>
クライアントアプリケーションを RMI-IIOP に適合させる:
import javax.naming.*; ... Context initialNamingContext = new InitialContext();
変更前のコード:
import java.rmi.*;
...
Hello obj = (Hello)Naming.lookup("//" +
getCodeBase().getHost() + "/HelloServer");変更後のコード: import javax.naming.*;
...
Hello obj = (Hello)PortableRemoteObject.narrow(
initialNamingContext.lookup("HelloServer"),
Hello.class);サーバの起動時に、ホストおよびポートが指定されます。スタブおよび Tie を再生成する必要はありません。javac -d $HOME/public_html/codebase HelloApp.java
ネームサーバおよび Hello サーバの起動
アプレットの例と同じ方法で起動します。
Hello アプリケーションのクライアントの起動
次のコードで起動します。
サーバのメッセージが、クライアントのコンソールに表示されます。java -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory -Djava.naming.provider.url=iiop://<hostname>:900 examples.hello.HelloApp
ulimit -n 90