RMIを使って、リモートホストにあるクラスをダウンロードして実行する方法について説明します。 このページでは、RMIについてでは、ローカルホストを使って、RMIの概念を理解していることを前提にしています。
RMIを使って、リモートホストにあるクラスをダウンロードして実行するためには、Webサーバにあるコードベース(codebase)を利用します。
コードベースとは、JVM(Java Virtual Machine)にクラスをロードするときの、クラスのある位置のことです。
クライアント側には、インターフェイスモジュールを用意するだけで、ソースを作成することができます。
従って、インターフェイスを変更しなければ、サーバ側のクラスファイルが更新されても、クライアントプログラムを再コンパイルする必要はありません。
動作の流れとしては、以下のようになります。
+-----------------+ +-----------------+
| +-----------+ | | +-----------+ |
| | Client | | | | Server | |
| +-----------+ | | +-----------+ |
| ↓参照 | | ↓登録 |
| +-----------+ | | +-----------+ |
| | lookup() | | | | bind() | |
| +-----------+ | | +-----------+ |
| ↑ │ | | ↓ |
| │ │ | | +-----------+ |
| │ └----------------------->|rmiregistry| | スタブインスタンスを返却
| │ | | +-----------+ |
+------│---------+ +-----------------+
│ +-----------------+
│ | +-----------+ |
│ | | Web Server| |
│ | +-----------+ |
└---------------------------| codebase | | スタブクラスをダウンロード
| +-----------+ |
+-----------------+
|
コードベースを使ったプログラミングでは、以下の手順は、RMIについてと同じものを使っています。
RMIレジストリを起動する場合は、スタブファイルにCLASSPATHを設定しておかないと、クライアントから接続時にスタブを検索できないためエラーが発生します。
以下のファイルをWebサーバからアクセスできる、コードベースディレクトリにコピーします。
unix# cp helloObj_Stub.class /usr/local/apache/htm/rmi/. |
コピーしたら、そのURLにアクセスできることを確認します。
unix# lynx http://www.ash.jp/rmi/ |
クライアントプログラムを作成するためには、リモートインターフェイス(helloIf.class)が必要ですので、サーバからダウンロードします。
クライアントプログラム(helloClient.java)を作成します。
プログラムの処理は、レジストリサーバ(www)から、lookupメソッドでリモートインターフェイスを取得し、「Hello World!」を返却するメソッド(helloMsg)を呼び出しています。
| helloClient.java |
|---|
import java.rmi.*;
public class helloClient {
public static void main(String args[]) {
helloIf hello = null;
try {
// セキュリティマネージャの設定
System.setSecurityManager(new RMISecurityManager());
// レジストリサーバの検索
hello = (helloIf)Naming.lookup("rmi://www.ash.jp/hello");
} catch(Exception ex) {
ex.printStackTrace();
}
try {
// メッセージの取得
System.out.println(hello.helloMsg());
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
|
javacで、ソースファイルをコンパイルします。
unix/dos# javac helloClient.java unix/dos# ls *.class helloIf.class helloClient.class |
ローカルマシン上でテストする場合は、ポリシーファイル(java.policy)は必要ありませんが、リモートからアクセスする場合には必要となります。 とりあえず、以下のように設定することで、何でも許可されるようになります。 ただしセキュリティ上、問題がありますので、評価時だけ使うようにしてください。
| java.policy |
|---|
grant {
permission java.security.AllPermission;
};
|
クライアントプログラムを起動し、「Hello World!」と表示されれば、成功です。
unix/dos# java -Djava.security.policy=java.policy -Djava.rmi.server.codebase=http://www.ash.jp/rmi/ helloClient Hello World! |