java rmi接口 超时设置_Spring RMI客户端读超时设置 | 学步园

本文介绍了Java RMI的三种超时设置方法,包括启动参数设置、应用程序内环境变量设置以及自定义SocketFactory。在Spring中,前两种方法适用于整个JVM级别的RMI服务,而自定义SocketFactory需注意在服务器端配置,并确保实现Serializable接口。文章提供了具体的服务器端配置示例代码。
摘要由CSDN通过智能技术生成

标准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端设置超时无效

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring为各种远程访问技术提供集成工具类。Spring远程访问通过使用普通POJOs,能更容易的开发远程访问服务。目前,Spring远程访问的主要技术如下: 1. 远程调用RMI(Remote Method Invocation): 通过使用 RmiProxyFactoryBean 和 RmiServiceExporter,并且,Spring支持两个传统的RMI(使用 java.rmi.Remote接口java.rmi.RemoteException)和通过RMI调用器实现的暴露远程调用(支持任何Java接口)。 2. Spring的HTTP调用器(Spring’s Http Invoker): Spring提供了一种特殊的允许通过HTTP进行Java串行化的远程调用策略,支持任意Java接口(就像RMI调用器)。相对应的支持类是 HttpInvokerProxyFactoryBean和 HttpInvokerServiceExporter。 3. Hessian: 通过 HessianProxyFactoryBean 和 HessianServiceExporter,可以使用Caucho提供的基于HTTP的轻量级二进制协议来透明地暴露服务。 4. Burlap: Burlap是Caucho的另外一个子项目,可以作为Hessian基于XML的替代方案。Spring提供了诸如 BurlapProxyFactoryBean 和 BurlapServiceExporter 的支持类。 5. JAX RPC: Spring通过JAX-RPC为远程Web服务提供支持(J2EE 1.4's web service API)。 6. JAX-WS:Spring通过JAX-WS为远程Web服务提供支持(the successor of JAX-RPC, as introduced in Java EE 5 and Java 6)。 7. JMS:远程访问通过类JmsInvokerServiceExporter和JmsInvokerProxyFactoryBean使用JMS的底层协议实现。 二. 远程访问------RMI 1. RMI远程访问基本流程 1). 服务端定义远程访问接口; 2). 服务端通过RmiServiceExporter暴露服务接口 3). 客户端定义与服务端已暴露的相同接口 4). 客户端通过RmiProxyFactoryBean调用服务接口
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值