2

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);
4

1 に答える 1

6

これは、DNS の構成ミスである可能性が最も高いです。Java は DNS とリバース DNS の両方を使用します。他方を検索するときは、クライアント ホストとサーバー ホストの両方で両方が正しく機能していることを確認してください。

于 2012-10-14T20:14:33.347 に答える