2015-11-04 51 views
1

我編寫了測試RMI服務器和客戶端程序。在服務器中有一種方法暴露給客戶端。Java RMI調用在幾百次中無故失敗

在客戶端上,我使用600線程執行程序服務來調用RMI方法6000次。

在服務器上,每個方法調用都會創建一個簡單的任務並將其提交給一個300線程執行程序服務。

每次執行時,我只會收到一次或兩次異常。所以,對於6000個電話,我會得到大約1到3個例外。而且,這些例外情況似乎只發生在初始階段。

java.rmi.ConnectIOException: Exception creating connection to: ; nested exception is: 
java.net.SocketException: Connection reset by peer 
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:631) 
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216) 
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202) 
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:129) 
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:194) 
at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:148) 
at com.sun.proxy.$Proxy0.receiveMessage(Unknown Source) 
at com.example.rmi.MsgTask.run(MsgTask.java:18) 
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) 
at java.util.concurrent.FutureTask.run(FutureTask.java:262) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
at java.lang.Thread.run(Thread.java:744) 

客戶端和服務器在同一臺機器上運行,同一個Eclipse IDE。

看起來好像rmi服務器程序在接收到請求時幾毫秒內忙時,請求可能會丟失。這個可以嗎?我應該採取這種行爲是否正常,並在未來在我的RMI客戶中建立「重試」方法?或者,我可以更改一些設置以確保請求不會丟失?

+0

看起來像在RMI服務器端對象中收到的每個調用都在單獨的線程上。所以,不需要在服務器端使用手動線程。雖然,如果留給'自動',線程數似乎沒有上限。 – Teddy

回答

3

您正在運行TCP偵聽積壓。當它填滿時,Windows主機將發出'連接重置'。

解決方案是減少負載或在小但增加的睡眠間隔後引入重試。

+0

非常感謝您指點這個方向。我在MacBook Pro上運行這個..希望你的答案仍然適用。任何有關多少KB的積壓可能會失敗的粗略數字...... – Teddy

+0

積壓以連接計數。它與千字節沒有任何關係。它可以是5到500或更多的任何值,如果不深入內核就無法發現它的實際情況。 – EJP

+0

這就像你提到的...我googled'TCP監聽backlog',並發現http://stackoverflow.com/questions/114874/socket-listen-backlog-parameter-how-to-determine-this-value和http: //tangentsoft.net/wskfaq/advanced.html#backlog – Teddy

2

錯誤處理總是一個好主意,特別是在網絡調用。不管你是否真的有問題。所以是的,我會處理這個並提供一個重試。

順便說一下,600線程似乎對我來說有點太多了。減少它們可能會解決你的麻煩。

+1

我同意他應該減少線程數。 500線程仍然會出現問題嗎? 100? 10? – DavidS