我編寫了測試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客戶中建立「重試」方法?或者,我可以更改一些設置以確保請求不會丟失?
看起來像在RMI服務器端對象中收到的每個調用都在單獨的線程上。所以,不需要在服務器端使用手動線程。雖然,如果留給'自動',線程數似乎沒有上限。 – Teddy