2012-07-05 127 views
1

我正在使用Java远程方法调用(RMI)测试Web应用程序。当我通过加密狗连接到互联网时,宽带; RMI需要很长时间来响应请求。完成方法调用大约需要10秒。只要我进行方法调用,我也可以看到互联网连接中的数据传输速率正在上升。所以肯定它似乎是通过外部网络在两个内部进程之间建立RMI连接。RMI响应非常慢

虽然与互联网断开连接,但响应速度变化很快,例如几毫秒。我的/ etc/hosts文件具有127.0.0.1本地主机的条目。我总是在方法调用url中使用127.0.0.1进行naming.lookup。但无法弄清楚如何让机器在连接到互联网时快速响应RMI呼叫。有什么建议么?

+0

您可以检查哪些接口的RMI服务器绑定。 Wireshark也可以帮助搞清楚发生了什么。 – biziclop 2012-07-05 11:41:32

+1

你可以改变rmiregistry在127.0.0.1上监听吗?只是为了隔离问题。 – biziclop 2012-07-05 11:44:22

+0

我找不到在[LocateRegistry](http://docs.oracle.com/javase/6/docs/api/java/rmi/registry/LocateRegistry.html)中这样做的方法,你能建议我一个这样做的方式? – Atharva 2012-07-05 11:49:52

回答

4

问题不是您用于查找RMI注册表的地址,而是它是查找调用结果的URL中的地址。这默认为系统中第一个接口的IP地址,所以我的猜测是当你连接到Internet时,它是你的外部连接。

我认为正在发生的事情是您拨打了127.0.0.1上的RMI注册表,这会返回您的Internet地址所需服务的位置,因此您的RMI呼叫将通过加密狗界面进行路由。

您需要设置the java.rmi.server.hostname property以告知RMI注册管理机构要在其RMI URL中返回哪个主机名或IP地址。

所以,你需要这样的东西:

String ipAddress = "10.1.2.3"; //Local IP address 
System.setProperty("java.rmi.server.hostname",ipAddress); 

String hostname = "myserver"; //hostname that resolves for a local address 
System.setProperty("java.rmi.server.hostname",hostname); 
+0

太棒了!它的工作原理:) – Atharva 2012-07-05 12:10:22

+0

非常好,但它并不告诉RMI注册表任何东西,它告诉从哪个JVM导出远程对象输出到存根中的IP地址/主机名。 – EJP 2012-07-05 13:20:41