最近在集群环境下测试RMI调用,在测试其中一个case的时候发现一个奇怪的问题,求有过类似问题的屌丝和大侠分享和指导,在下不胜感激!!
测试case:Server A ServerB在完全工作的时候RMI调用是正常的,此时重启其中一台serverB,此时ServerA发送请求到ServerB就会报错,只能重启serverA,才能正常工作。
测试环境:serverA linux,serverB linux
测试服务器:websphere
报错信息:
- Java code
Caused by: java.rmi.UnmarshalException: Error unmarshaling return header; nested exception is: java.net.SocketException: Broken pipe at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:221) at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:154) at com.cs.core.remoting.rmi.RMIInvocationHandler_Stub.invoke(RMIInvocationHandler_Stub.java:53) at com.cs.core.remoting.service.CSRMIServiceContext$EERMIProxy.invoke(CSRMIServiceContext.java:174) ... 78 moreCaused by: java.net.SocketException: Broken pipe
------解决方案--------------------------------------------------------
不知道你具体RMI的实现方式。
可以考虑学习数据库连接池的做法,建议调整:
如果发现Socket已经断开,则重新创建连接(重建RMI代理),然后再进行重试。
如果重试又立即失败,则才算真的失败。
------解决方案--------------------------------------------------------
ServerA 访问 ServerB 失败后是如何处理的,比如LZ所述发生了异常,ServerA是怎么对应的,是直接抛出异常?还是retry?还是。。。
------解决方案--------------------------------------------------------
可能一情况是,A到B有通信连接,B重起了,但A还是用原来的连接通信,所以报错。
可以用try catch捕获,当连接断开,就重新建立连接。建立连接超时可以给出提示。
------解决方案--------------------------------------------------------