日期:2014-05-17  浏览次数:20731 次

集群环境测试RMI调用报错,求大侠帮忙解决
最近在集群环境下测试RMI调用,在测试其中一个case的时候发现一个奇怪的问题,求有过类似问题的屌丝和大侠分享和指导,在下不胜感激!!
测试case:Server A ServerB在完全工作的时候RMI调用是正常的,此时重启其中一台serverB,此时ServerA发送请求到ServerB就会报错,只能重启serverA,才能正常工作。
测试环境:serverA linux,serverB linux
测试服务器:websphere
报错信息:
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 more
Caused by: java.net.SocketException: Broken pipe

------解决方案--------------------
不知道你具体RMI的实现方式。

可以考虑学习数据库连接池的做法,建议调整:
如果发现Socket已经断开,则重新创建连接(重建RMI代理),然后再进行重试。
如果重试又立即失败,则才算真的失败。
------解决方案--------------------
ServerA 访问 ServerB 失败后是如何处理的,比如LZ所述发生了异常,ServerA是怎么对应的,是直接抛出异常?还是retry?还是。。。

------解决方案--------------------
可能一情况是,A到B有通信连接,B重起了,但A还是用原来的连接通信,所以报错。
可以用try catch捕获,当连接断开,就重新建立连接。建立连接超时可以给出提示。
------解决方案--------------------
引用:
我是用RMI的方式(TestRemote s = (TestRemote) Naming.lookup("rmi://10.39.101.70:1099/server");)serverB重启后,……


如果发生异常,重新初始化Context,重做lookup。也就是完整的重来一次。