UnicastRemoteObject をパラメーターとして渡す OSX サーバー上の RMI Ubuntu クライアントからメソッドを呼び出すと、処理が非常に遅くなります。非常に遅いため、最終的には実行されますが、2〜3分後にタイムアウト例外が発生する可能性が高くなります。両方のマシンが同じネットワーク内にあります。新しくインストールされたUbuntu 12.04です。使用している RMI ポートで Ubuntu マシンから OSX マシンに telnet で接続できるので、この時点では問題はないようです。この UnicastRemoteObject パラメータなしでサーバー上のメソッドを呼び出すこともでき、すべて正常に動作します。OSXからOSXでも大丈夫です...
これは、サーバーの起動方法です。
LocateRegistry.createRegistry(port);
nodeManager = new NodeManagerImpl(maxConfigurationsPerNode, true);
Registry registry = LocateRegistry.getRegistry(host, port);
registry.rebind("NodeManager", nodeManager);
そして、これは、クライアントがどのように接続してメソッドを呼び出すかです:
Registry registry = LocateRegistry.getRegistry(host, port);
nodeManager = (NodeManager) registry.lookup("NodeManager");
handler = new NodeHandlerImpl();
id = nodeManager.register(handler, id);
NodeHandlerImpl は基本的にこれです:
public class NodeHandlerImpl extends UnicastRemoteObject implements NodeHandler {
public NodeHandlerImpl(boolean noSSL) throws RemoteException {
super(0, null, null);
}
....
}
「登録」の呼び出しには時間がかかります... NodeHandler は Remote を拡張します。パラメータ ハンドラを削除すると、すべて正常に動作します...
私は数時間ここで立ち往生しています。手がかりは素晴らしいでしょう。
// 編集: はい、リバース DNS がエラーでした。このヒントで、私はこのサイトを見つけました: http://www.communardo.de/home/techblog/2008/09/17/rmi-kommunikation-zu-remote-hosts-mit-unguenstiger-dns-konfiguration/
そこで、クライアント接続コードを次のように変更しましたが、すべて問題ありませんでした。
System.setProperty("java.rmi.server.hostname", host);
Registry registry = LocateRegistry.getRegistry(host, port);
nodeManager = (NodeManager) registry.lookup("NodeManager");
handler = new NodeHandlerImpl();
id = nodeManager.register(handler, id);