2

当我从 OSX 服务器上的 RMI Ubuntu 客户端调用一个方法时,将 UnicastRemoteObject 作为参数传递,事情非常慢。如此缓慢,最终它会被执行,但更有可能的是,我在 2-3 分钟后出现超时异常。两台机器都在同一个网络中。这是一个新安装的 Ubuntu 12.04。我可以在使用的 RMI 端口上从 Ubuntu 机器远程登录到 OSX 机器,所以在这一点上,这似乎不是问题。我也可以在没有此 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 回答