Java RMI - 从Ubuntu到OSX的远程调用超级慢

时间:2012-10-14 20:06:52

标签: java rmi

当我从OSX服务器上的RMI Ubuntu客户端调用方法传递UnicastRemoteObject作为参数时,事情非常缓慢。这么慢,最终,它会被执行但更有可能,我会在2-3分钟之后得到超时异常。两台机器都在同一个网络中。这是一个新安装的Ubuntu 12.04。我可以从Ubuntu机器远程登录到使用过的RMI端口上的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);

1 个答案:

答案 0 :(得分:6)

这很可能是DNS配置错误。 Java使用DNS和反向DNS。查看另一个时,确保两者在客户端和服务器主机上都正常工作。