当我从 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);