RMI-IIOP

RMI-IIOP(RMI over IIOP)とは



RMI-IIOP(Remote Method Invocation over Internet Inter-ORB Protocol)は、CORBA(Common Object Request Broker Architecture)システム上でJava RMI(Remote Method Invocation)インターフェースを利用するための技術です。この標準は、CORBAの持つ利点を維持しながら、CORBAアプリケーションの開発をより簡単にするために設計されました。

概要



RMI-IIOPは、Object by Valueという概念に基づいており、これはCORBAの構造体、共用体、シーケンス、配列、文字列などを置き換えるコンテナとして機能します。IDL(Interface Definition Language)は使用されず、代わりにデータ構造の定義が自動的に推測され、リフレクション機構によって必要なデータが収集されます。CORBAでは、転送される各データ構造に対して補助的なクラスを生成する必要がありましたが、RMI-IIOPではリモートオブジェクト用に生成されたコードのみを使用できます。これにより、生成されるコードの量が少なくなり、メモリ使用量を減らすことができます。

CORBAとRMI-IIOPはどちらも、通信規格としてGIOP(General Inter-ORB Protocol)を使用しています。RMI-IIOPのデータ構造については、必要に応じてIDLを生成することも可能で、これを利用してRMI-IIOPと純粋なCORBAアプリケーション間の相互運用を実現できます。

最近のRMI-IIOPのバージョンでは、標準のサーバントクラスからサーバントを生成できます。これにより、CORBAのORB(Object Request Broker)に手動で接続し、Portable Object Adapter(POA)、Portable Interceptor、CORBAネーミングサービスなどのさまざまなCORBA機能にアクセスできます。

Hello world の例



Java RMI-IIOPを実装したパッケージの標準的な名前は `javax.rmi.CORBA` です。

インターフェースの例


以下は、`MyServer` および `MyClient` という2つのリモートインターフェースの例です。

java
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;
}


クライアントとサーバの機能実装


以下は、`MyServerImpl` と `MyClientImpl` という、上記のインターフェースを実装するクラスの例です。

java
public class MyServerImpl implements MyServer {
public 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);
}
// これはリモートメソッド
public void receiveReply(String message) throws RemoteException {
System.out.println("And the answer is: " + message);
}
// これはリモートメソッドではなく、ローカルメソッド
public void talk(String conversation) {
server.receiveRequest(this, conversation);
}
}


`rmic` ツールは、これらのクラスを使用して、リモート側で使用される2つのスタブと、サービス側で使用される2つのTieを生成します。スタブとTieのペアは、それぞれクライアント側とサーバー側に配置されます。

サーバー機能の開始に必要なコード


以下は、サーバー機能を起動するために必要なコードの例です。

java
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();


クライアント機能の開始に必要なコード


以下は、クライアント機能を起動するために必要なコードの例です。

java
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スレッドが開始した後、クライアント側で以下のコードを実行します。

java
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(Object Management Group)の商標であるため、使用には注意が必要です。このプロトコルはGIOP上にあるため、`GIOP` を使用していると表現する方が適切な場合もあります。これは間違いではありませんが、正確さを欠く可能性があります(GIOPの実装は他にも多数存在します)。詳細については、GIOPを参照してください。

外部リンク



The official RMI-IIOP standard from the OMG group
The official CORBA standard from the OMG group

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。