かなり枯れた?技術だけど手をつけてないものにJavaのRMIってのがある。
要はリモート呼び出し。
Javaからしか呼べないけど、SOAPとかそこらへんの汎用的なものより早いのが多分売り。
なので、これをちょいと試して見る。
開発環境は、Java SE6 + NetBeans6 beta1です。
サーバー側のプログラム作成
サーバー側のプログラムは、まずインターフェースを作らないといけない。
守らなきゃいけないのは、以下の2つ。
- java.rmi.Remoteを継承する
- メソッドはjava.rmi.RemoteExceptionをスローする
これを守って書くと↓のようになる。
package kazuki.rmi;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface HelloWorld extends Remote {
String sayHelloWorld() throws RemoteException;
}
次は、これの実装クラスを書く。
実装クラスは、当然↑で定義したインターフェースを実装するんだけど、気を付けないといけないことが2つある。
- java.rmi.server.UnicastRemoteObjectを継承する
- throws java.rmi.RemoteExceptionのついたコンストラクタを用意する
これを守って書くと↓のようになる。
package kazuki.rmi;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class HelloWorldImpl extends UnicastRemoteObject implements HelloWorld {
public HelloWorldImpl() throws RemoteException {
super();
}
public String sayHelloWorld() throws RemoteException {
return "Hello world";
}
}
最後に、これをリモートで呼び出せるように登録をするプログラムを書く。
ググった感じだと、rmiregistryをコマンドラインから起動してNamingクラスを使うよ~って書いてあるけど、うちじゃ頑張ったけどうまくいかなかった。
なので、java.rmi.LocateRegistryを使った。
createRegistryで作ってbindで登録する。コードは↓のとおり。
package kazuki.rmi;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class RmiServer {
public static void main(String[] args) throws Exception {
Registry reg = LocateRegistry.createRegistry(1099);
reg.bind("HelloWorld", new HelloWorldImpl());
}
}
クライアント側プログラム
クライアント側プログラムは、Registryから目的のブツをゲットして呼び出すだけ。
さくっと書いてしまおう。
package kazuki.client;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import kazuki.rmi.HelloWorld;
public class RmiClient {
public static void main(String[] args) throws Exception {
Registry reg = LocateRegistry.getRegistry(1099);
HelloWorld helloWorld = (HelloWorld) reg.lookup("HelloWorld");
System.out.println(helloWorld.sayHelloWorld());
}
}
getRegistryで、Registryを取得。その後lookupで呼び出したいブツをゲット。
後は普通にクラスを使う要領で使ってやればいい。
NetBeans6から、起動構成?を複数作れるから、サーバ側とクライアント側の起動を簡単に切りかえれて便利になった。