我有一个RMI服务器,远程客户端无线连接。一切都很好,直到无线连接被切断。我的RMI服务器检测到它没有从客户端收到ping并对客户端执行ping操作,该客户端抛出异常然后我处理。问题是抛出此异常需要大约25秒,因此RMI服务器不会响应来自其他连接客户端的任何请求,直到抛出异常。
我一直在搜索,已将客户端和服务器上的属性设置为connectionTimeout, responseTimeout, disableHttp
,但没有成功。希望有人可以帮助我指明我的网络。
答案 0 :(得分:0)
与此相关的唯一Sun RMI system properties是sun.rmi.transport.tcp.responseTimeout
和sun.rmi.transport.tcp.readTimeout
,您需要在导出任何远程对象之前设置它们。
但是我质疑你的诊断。 RMI运行时系统和RMI服务器都不是单线程的,因此25秒的延迟不会阻止其他客户端。
因此,如果您遇到客户端停顿,则不是RMI的错。可能是网络堆栈行为不端。
我进一步质疑你的整个策略。 RMI使用连接池,而不是永久连接:ping服务器和客户端的想法完全违背RMI原则,并浪费连接。我会摆脱所有这些ping,只是处理java.rmi.ConnectExceptions
时,如果它们出现。您可以通过该页面上的其他系统属性稍微控制连接生存期。
如果您正在寻找能够检测消失的客户的解决方案,那么有更好的解决方案:请参阅this answer和this one。