当前位置:编程学习 > JAVA >>

rmi 超时的问题

大家好,目前我遇到rmi超时的问题。


目前我们这里的网络是通过代理访问防火墙内的机器。例 A -> B -> C。A机器请求B机器1099端口,B把收到的内容转发给C机器的1099端口。根据你的文章http://blog.csdn.net/ktyl2000/article/details/4485896。已经可以正常穿过代理。
目前出现超时的问题。我们这里执行远程方法时间比较长。
报错:
Error unmarshaling return header; nested exception is: 
java.net.SocketTimeoutException: Read timed out

基本2小时准时报错。
根据错误我做了几处修改:
1.
http://bbs.chinaunix.net/thread-2036362-1-1.html
根据这个文章,我修改了linux tcp连接参数。
  
2.
修改jvm参数
-Dsun.rmi.transport.tcp.responseTimeout=144000000 
-Dsun.rmi.transport.tcp.readTimeout=180000000
设置成了两个比较大的值

3.
修改代码 RMISocketFactory

修改类文件  public class SMRMISocket extends RMISocketFactory中的两个方法。

public Socket createSocket(String host, int port) throws IOException {
Socket socket = null; 
try{
socket = new Socket();
socket.setSoTimeout( 10 * 3600 * 1000 );
socket.setSoLinger( false, 0 );
socket.setKeepAlive(true);
socket.connect( new InetSocketAddress( host, port ), 10 * 3600 * 1000 );
}catch(IOException e){
LOG.error("SMRMISocket error :" + "host:" + host + " port : " + port + " message " + e.getMessage());
throw new IOException(e.toString());
}
return socket;
}

--------------------------------------------------------------------------
public ServerSocket createServerSocket(int port) throws IOException {
if (port == 0){
port =9700
}
ServerSocket ss = new ServerSocket(port);
ss.setSoTimeout(10 * 3600 *1000);
return ss;
}


做了上面的修改后
rmiObj = (IProcessExec) Naming.lookup("//10.96.25.123:1099/schedul");
rmiObj.exec(“accd”);
通过exec执行一个小的任务,不报错,正常完成。
但执行大的任务(超过1小时),客户端一直停在了exec这行代码上。直到报超时错误。就算是服务端执行1个小时任务后退出,客户端也需要等报超时错误后结束。很奇怪。
执行大途程时,感觉服务端是正常的,可以正常执行,正常退出。但客户端却收不到服务端结束的信号,一直处在等待,直到超时。

通过查看上面代码中的打出的log 发现

 
注:9700为服务注册端口。9701为通信端口。

--------------------编程问答-------------------- 感觉是你没关闭socket,检查一下
补充:Java ,  Java EE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,