RMIでリモートコールしてくれない件
以下のようなクラスがあって、
Echo.java
package rmitest; import java.io.Serializable; import java.rmi.Remote; import java.rmi.RemoteException; public interface Echo extends Remote, Serializable{ public String sayEcho(String message) throws RemoteException; }
EchoImpl.java
package rmitest; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; public class EchoImpl implements Echo{ public String sayEcho(String message) { System.out.println("server=" + message); return message; } public static void main(String[] args) throws Exception{ Registry registry = LocateRegistry.createRegistry(Registry.REGISTRY_PORT); Echo echo = new EchoImpl(); //Remote remote= UnicastRemoteObject.exportObject(echo, 0); //registry.rebind("echo", remote); registry.rebind("echo", echo); System.out.println("wait"); synchronized(EchoImpl.class){ EchoImpl.class.wait(); } System.out.println("end"); } }
EchoClient.java
package rmitest; import java.rmi.Naming; public class EchoClient { public static void main(String[] args) throws Exception { Echo echo = (Echo)Naming.lookup("echo"); String message = echo.sayEcho("hoge"); System.out.println("client=" + message); } }
EchoImplを実行、EchoClientを実行すると、期待している動作では、
サーバーのコンソール
server=hoge
クライアントのコンソール
client=hoge
となるはずであるが、
実際は、以下のようになる。
クライアントのコンソール
server=hoge client=hoge
exportObject(あるいはUnicastRemoteObjectを継承)せずに、レジストリにバインドすると、リモート呼び出しにならずに、ローカル呼び出し(newして実行?)になるらしい。RMIってそういう挙動だったのか。今日はじめて知りました。これで朝1時間ははまった。