2012-07-05 128 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