標準Java的RMI設置我所知道的有三種方式,其中第1、2種不區分框架均適用,但影響整個JVM級別的RMI服務
1.?啟動時設置sun.rmi.transport.tcp.responseTimeout,單位是毫秒
java?-Dsun.rmi.transport.tcp.responseTimeout=50
2.在應用程序中設置環境變量sun.rmi.transport.tcp.responseTimeout
System.setProperty("sun.rmi.transport.tcp.responseTimeout",?"5000")??單位也是毫秒
3.自定義socketfactory,具體用法參照官方這個指南
http://docs.oracle.com/javase/1.4.2/docs/guide/rmi/socketfactory/index.html
在Spring中,前面兩種都能生效,第三種有些地方需要注意
1.?在server端設置自定義的socket?factory
2.需要設置的是clientSocketFactory和serverSocketFactory這兩個屬性,而不是registryClientSocketFactory和registryServerSocketFactory,而且這兩個屬性要不全部設置,要不全部不設置,不能只設置一個
3.自定義的socketfactory必須實現Serializable接口(最好同時重寫hashCode和equals方法)
具體用法如下:
server端配置
RMICustomClientSocketFactory.java
public?class?RMICustomClientSocketFactory?implements?RMIClientSocketFactory,?Serializable?{
/**
*
*/
private?static?final?long?serialVersionUID?=?2879181835011310833L;
private?int?timeout;
/**
*?設置超時時間
*
*?@param?timeout
*/
public?void?setTimeout(int?timeout)?{
this.timeout?=?timeout;
}
@Override
public?Socket?createSocket(String?host,?int?port)?throws?IOException?{
Socket?socket?=?new?Socket();
socket.setSoTimeout(timeout);
socket.setSoLinger(false,?0);
socket.setKeepAlive(false);
socket.connect(new?InetSocketAddress(host,?port),?timeout);
return?socket;
}
}
RMICustomServerSocketFactory.java
public?class?RMICustomServerSocketFactory?implements?RMIServerSocketFactory,Serializable?{
/**
*
*/
private?static?final?long?serialVersionUID?=?8357061901854965297L;
private?int?timeout?=?17;
public?void?setTimeout(int?timeout)?{
this.timeout?=?timeout;
}
@Override
public?ServerSocket?createServerSocket(int?port)?throws?IOException?{
ServerSocket?serverSocket?=?new?ServerSocket(port);
serverSocket.setSoTimeout(timeout);
return?serverSocket;
}
}
在2.5.6和3.1.2中測試通過,另外在client端設置超時無效
標準Java的RMI設置我所知道的有三種方式,其中第1、2種不區分框架均適用,但影響整個JVM級別的RMI服務
1.?啟動時設置sun.rmi.transport.tcp.responseTimeout,單位是毫秒
java?-Dsun.rmi.transport.tcp.responseTimeout=50
2.在應用程序中設置環境變量sun.rmi.transport.tcp.responseTimeout
System.setProperty("sun.rmi.transport.tcp.responseTimeout",?"5000")??單位也是毫秒
3.自定義socketfactory,具體用法參照官方這個指南
http://docs.oracle.com/javase/1.4.2/docs/guide/rmi/socketfactory/index.html
在Spring中,前面兩種都能生效,第三種有些地方需要注意
1.?在server端設置自定義的socket?factory
2.需要設置的是clientSocketFactory和serverSocketFactory這兩個屬性,而不是registryClientSocketFactory和registryServerSocketFactory,而且這兩個屬性要不全部設置,要不全部不設置,不能只設置一個
3.自定義的socketfactory必須實現Serializable接口(最好同時重寫hashCode和equals方法)
具體用法如下:
server端配置
RMICustomClientSocketFactory.java
public?class?RMICustomClientSocketFactory?implements?RMIClientSocketFactory,?Serializable?{
/**
*
*/
private?static?final?long?serialVersionUID?=?2879181835011310833L;
private?int?timeout;
/**
*?設置超時時間
*
*?@param?timeout
*/
public?void?setTimeout(int?timeout)?{
this.timeout?=?timeout;
}
@Override
public?Socket?createSocket(String?host,?int?port)?throws?IOException?{
Socket?socket?=?new?Socket();
socket.setSoTimeout(timeout);
socket.setSoLinger(false,?0);
socket.setKeepAlive(false);
socket.connect(new?InetSocketAddress(host,?port),?timeout);
return?socket;
}
}
RMICustomServerSocketFactory.java
public?class?RMICustomServerSocketFactory?implements?RMIServerSocketFactory,Serializable?{
/**
*
*/
private?static?final?long?serialVersionUID?=?8357061901854965297L;
private?int?timeout?=?17;
public?void?setTimeout(int?timeout)?{
this.timeout?=?timeout;
}
@Override
public?ServerSocket?createServerSocket(int?port)?throws?IOException?{
ServerSocket?serverSocket?=?new?ServerSocket(port);
serverSocket.setSoTimeout(timeout);
return?serverSocket;
}
}
在2.5.6和3.1.2中測試通過,另外在client端設置超時無效