(Translated by https://www.hiragana.jp/)
RMI-IIOP - Wikipedia コンテンツにスキップ

RMI-IIOP

出典しゅってん: フリー百科ひゃっか事典じてん『ウィキペディア(Wikipedia)』

RMI-IIOP(RMI オーバー IIOP)とは、CORBAシステムじょうJava RMIインタフェースをす。

概要がいよう

[編集へんしゅう]

この標準ひょうじゅんは、CORBA の利点りてんたもちつつ、CORBA アプリケーションの開発かいはつ単純たんじゅんするべく作成さくせいされた。RMI-IIOP は、CORBA 構造こうぞうたい共用きょうようたい、シーケンス、配列はいれつ文字もじれつなどを置換ちかんするコンテナとしてはたらく Object by Value の概念がいねんもとづいている(CORBA項目こうもく参照さんしょう)。IDL使つかわれていない。わりに自動的じどうてきにデータ構造こうぞう定義ていぎ推定すいていし、リフレクション機構きこう必要ひつようなデータをあつめる。CORBA では転送てんそうすべきデータ構造こうぞうごとに補助ほじょてきなクラスを生成せいせいする必要ひつようがあるが、RMI-IIOP ではリモートオブジェクトけに生成せいせいされたコードを使つかうだけでよい。生成せいせいすべきコードりょうすくないため、メモリ使用しようりょうらせる。

CORBA と RMI-IIOP はどちらも通信つうしん規格きかくGIOP使用しようしている。RMI-IIOP のデータ構造こうぞうについて、必要ひつようならばIDL生成せいせいすることも可能かのうで、それを使つかって、RMI-IIOP と 純粋じゅんすいな CORBA アプリケーションの相互そうご運用うんようおこなうことも可能かのうである。

RMI-IIOP の最近さいきんのバージョンでは標準ひょうじゅんサーバントクラスからサーバントを生成せいせいできる。これを使つかうと CORBA の ORB に手動しゅどう接続せつぞくでき、Portable Object Adapter、Portable Interceptor、CORBA のネーミングサービスなどの各種かくしゅ CORBA 機能きのう接続せつぞく可能かのうである。

Hello world のれい

[編集へんしゅう]

Java RMI-IIOP を実装じっそうしたパッケージの標準ひょうじゅんてき名称めいしょうjavax.rmi.CORBA である。

インタフェース

[編集へんしゅう]
public interface MyServer extends Remote
{
  // クライアントは self をだいいち引数ひきすうわたす。サーバはクライアントがわ
  // にあるリモートメソッドをせる。これは要求ようきゅう処理しょり時間じかんがかかる場合ばあいに
  // 便利べんりである。
  void receiveRequest(MyClient client, String message) throws RemoteException;
}
public interface MyClient extends Remote
{
  // このリモートメソッドはサーバからされる
  void receiveReply(String message) throws RemoteException;
}

クライアントとサーバの機能きのう実装じっそう

[編集へんしゅう]
public class MyServerImpl implements MyServer
{
   void receiveRequest(MyClient client, String message) throws RemoteException
   {
     System.out.println("The client says: "+message);
     client.receiveReply("Yes, "+message+", "+message+", "+message+"...");
   }
}
public class MyClientImpl implements MyClient
{
   MyServer server;
   public MyClientImpl(String Server_IOR, ORB orb)
     throws Exception
   {
     server = (MyServer) PortableRemoteObject.narrow(
                 orb.string_to_object(Server_IOR), MyServer.class);
   }
   // これはリモートメソッド
   void receiveReply(String message) throws RemoteException
   {
     System.out.println("And the answer is: "+message);
   }
   // これはリモートメソッドではなく、ローカルメソッド
   public void talk(String conversation)
   {
      server.receiveRequest(this, conversation);
   }
}

RMI-IIOP 開発かいはつツール(rmic)は上記じょうき2つのクラスを使つかい、リモートがわ使つかわれる2つのスタブとサービスがわ使つかわれる2つの Tie を生成せいせいする。つまり、スタブと Tie のペアがそれぞれクライアントがわとサーバがわかれる。

サーバ機能きのう開始かいし必要ひつようなコード

[編集へんしゅう]
       new Thread()
       {
         public void run()
         {
           try
             {
               // CORBA ORB の生成せいせい
               MyServerImpl.orb = ORB.init(args, properties);
               // ルート Portable Object Adapter を取得しゅとく:
               POA rootPOA = POAHelper.narrow
                 (MyServerImpl.orb.resolve_initial_references("RootPOA"));              
               // MyServerImpl にはサーバがサポートしなければならない
               // メソッドの実装じっそうふくまれる。
               MyServerImpl impl = new MyServerImpl();
               PortableRemoteObject.exportObject(impl);
               // Tie の構築こうちく。Tie はサーバントでもある。
               // _MyServerImpl_Tie クラスは MyServerImpl から自動的じどうてき生成せいせいされる。
               Tie tie = new _MyServerImpl_Tie();
               // この Tie のしターゲットを設定せってい
               tie.setTarget(impl);
               // 対応たいおうする CORBA オブジェクトへの参照さんしょう取得しゅとく:
               org.omg.CORBA.Object object = rootPOA.servant_to_reference((Servant) tie);
               // ルート POA の活性かっせい
               rootPOA.the_POAManager().activate();
               // クライアントにわたす IOR URL を取得しゅとく
               String Server_IOR = MyServerImpl.orb.object_to_string(object);
               MyServerImpl.orb.run();
               // 文字もじれつ変数へんすう Server_IOR の内容ないようをどうにかしてクライアントに
               // 転送てんそうしなければならない
             }
           catch (Exception exc)
             {
               exc.printStackTrace();
             }
         }
       }.start();

クライアント機能きのう開始かいし必要ひつようなコード

[編集へんしゅう]
      MyClient the_client;
      
       new Thread()
       {
         public void run()
         {
           try
             {
               ORB orb = ORB.init(args, parameters);
               the_client = new MyClientImpl(Server_IOR, orb);
               POA rootPOA = POAHelper.narrow(desk.orb.resolve_initial_references("RootPOA"));
               rootPOA.the_POAManager().activate();
               // Tie 構築こうちく
               Tie tie = new _MyClientImpl_Tie();
               // 実装じっそうクラス(しターゲット)の設定せってい
               tie.setTarget(the_client);
               // Tie を POA サーバントとして接続せつぞく
               org.omg.CORBA.Object object = rootPOA.servant_to_reference((Servant) tie);
               // IOR 文字もじれつ使つかってWebじょうでこのオブジェクトをさがすことが可能かのう
               String IOR = desk.orb.object_to_string(object);
               orb.run();
             }
           catch (Exception exc)
             {
               exc.printStackTrace();
             }
         }
       }.start();

ORB スレッドが開始かいししたのちで、以下いかのコードを実行じっこうする:

the_client.talk("it is raining");

実行じっこう

[編集へんしゅう]

最初さいしょにサーバ、つぎにクライアントがそれぞれべつのマシンじょう開始かいしされる(どういちマシンのべつプロセスでもよい)。サーバは The client says: it is raining表示ひょうじする。クライアントは And the answer is: Yes, it is raining, it is raining, it is raining..表示ひょうじする。

ここにしめしたコードはサン・マイクロシステムズの Java 1.5 と GNU Classpath 0.95 で動作どうさする。

略語りゃくご利用りよう法的ほうてき問題もんだい

[編集へんしゅう]

IIOP という略称りゃくしょうOMG商標しょうひょうであり、利用りようには注意ちゅうい必要ひつようである。このプロトコルは GIOP じょうにあるため、GIOPを利用りようしているとしたほうがよい場合ばあいもある。これは間違まちがいではないが、やや正確せいかくさをく(GIOP の実装じっそうほかにも様々さまざま存在そんざいする)。くわしくはGIOP参照さんしょうされたい。

外部がいぶリンク

[編集へんしゅう]