RMI入門その1

RMIの入門テキストを3回に分けて書きます。初回はinterface編です。

RMI(Remote Method Invocation)はJavaで分散システムを作成するのに、非常に便利な仕掛けです。同じような仕組みとしては他にCORBAがありますが、RMIはコアパッケージに入っているので、余計な出費無しで利用することができます(FreeのCORBA実装もありますが)。Java以外の言語で作成されたシステムとの通信に難がありましたが、これもIIOPがサポートされる等、改善されてきています。RMIの入門ドキュメントはSunのTutorialにありますので、そちらも参照してください。

RMIは簡単に言うと他のJavaプログラム上のオブジェクトのメソッドを呼び出す機能です。ここで他のプログラムというのは、現在実行しているJava VM以外のJava VMで動いているものですので、異なるホストはもちろん、同じホスト上で動いていても、別のプロセス(Unixでいうところの)になっていることです(概ね)。

RMIでは他のプログラムにメソッドを提供する側(RMIのサーバ)と他のプログラムのメソッドを呼び出す側(RMIのクライアント)との間は、interfaceを介しています。そのため、RMIのサーバ側ではinterfaceをimplementsしていさえすれば、後で実装を変えたり、他のinterfaceもimplementsしたり、といったことをクライアント側とは独立に行うことができます。

RMIのプログラムを作成する手順としては、

  1. サーバ、クライアント間のinterfaceを作成する。
  2. サーバ、クライアントを作成する。
  3. rmicでスタブを作成する。
  4. rmiregistry等によりレジストリを作って実行。
といった感じになります。早速簡単なプログラムを作ってみましょう。作成するプログラムとしてはサーバ側の環境情報(Javaのバージョン番号等)をクライアント側に取ってきて表示する、というものを考えます。最初にinterfaceを作成します。例えば、
import java.rmi.Remote;
import java.rmi.RemoteException;

public interface ServerEnvironment extends Remote {
	public String getJavaVersion() throws RemoteException;
}
てな感じでしょうか。

RMI用のinterfaceはjava.rmi.Remoteをextendsする必要があります。java.rmi.Remoteはメソッドが定義されていない空のinterfaceですから、何も考えずにextends java.rmi.Remoteを書けばよいでしょう。

一方RMI用のinterfaceのメソッドのシグネチャに使用できるのは、基本データ型(intやlong等)、java.io.Serializableをimplementsしているオブジェクト、またはリモートオブジェクトのinterfaceとなっています。

基本データ型は何も考える点はありませんし、java.lang.Stringの様に、Javaのコアパッケージの大抵のクラスはSerializableを直接的あるいは間接的にimplementsしていますので、最初の2つの制限は気にはなりません。注意すべき点としては、RMIでは通常のローカルメソッド呼び出しと異なり、引数が値渡しになる点です。

ローカルメソッドの様に参照渡しと同じことをやりたい場合はリモートオブジェクトを渡すことになります。異なるVM上で同じオブジェクトを参照することはできないので、こうした細工が必要になるわけです。


人材開発室 PoisonSoft