Spring RMI源码解读

SpringRMI源码解读

  作者:李红序,转载时请指明作者出处  QQ群号: JAVA高级技术交流(215597268)

 

1. RMI服务端源代码解读

SpringRMI服务发布是通过RmiServiceExporter类来实现。RmiServiceExporter的类图结果如下:

 Spring RMI源码解读

 

Spring容器启动时,RmiServiceExporter prepare方法就会被调用,来完成Rmi 服务的发布工作。代码解读如下:

prepare 方法流程如下:

1. 获取RMIRegister对象,来实现端口服务的注册

 Spring RMI源码解读

 

2. 获取发布服务的对象 getObjectToExport

根据发布服务的接口的类型来确定使用Wrapper包装发布或直接接口发布。

 Spring RMI源码解读

 

 

3. 使用UnicastRemoteObject发布RMI服务对象

 Spring RMI源码解读

 

Spring RMI服务发布的整个流程就如上面所述。整个流程还是比较简洁易了解的。

RmiServiceExporter的属性配置讲解:

a) registryPort 服务注册端口。默认为1099

b) registryHost 服务注册IP(在多网卡IP下,建议指定).默认为空表示不指定

c) serviceName 服务名称,不能为空

d) servicePort 服务端口。默认值为0,表示在与服务通信时将使用匿名端口

e) alwaysCreateRegistry 是否复用Registry注册的端口。默认为false,表示复用

f) replaceExistingBinding 是否替换已经发布的服务。默认为true,表示替换

 

2. RMI客户端源代码解读

Spring的RMI服务发布是通过RmiProxyFactoryBean类来实现。RmiProxyFactoryBean的类图结果如下:

 Spring RMI源码解读

当Spring 容器启动时,RmiProxyFactoryBean 的afterPropertiesSet 方法就会被调用,

来完成Rmi 服务端口端的代理功能。代码解读如下:

1.   创建代理对象

 Spring RMI源码解读

2.   当代理对象的方法被调用时,会触发invoke 方法

 Spring RMI源码解读

getStub 方法,是进行RMI 服务调用,获取RMI 服务对象。

 

doInvoke方法是通过获取的RMI服务对象,进行方法的反射调用

doInvoke方法根据RMI服务对象的类型,进行判断。

下面是根据Spring的Wrapper封状的服务时

 Spring RMI源码解读

 

下面是普通的RMI服务调用时

 Spring RMI源码解读

RmiProxyFactoryBean的属性配置讲解:

a) lookupStubOnStartup是否启动时连接RMI服务。默认为true,表示启动时立即连接,这个属性建议设置成false,可避免当服务器不可用时,客户端的服务无法正常启动。

b) cacheStub缓存RMI服务对象。默认为true,表示进行缓存。注意进行缓存的对象,当网络出现异常时,会导致服务不可用。

c) refreshStubOnConnectFailure当服务不可用时,是否进行重连。默认为false表示不重连,这个属性强烈建议设置为true.

 

相关文章

http://java.sun.com/developer/onlineTraining/Programming/JDCBook/rmi.html

http://v1.dione.zcu.cz/java/docs/jdk1.1/docs/guide/rmi/spec/rmiTOC.doc.html

http://static.springsource.org/spring/docs/2.5.x/reference/remoting.html#remoting-rmi

Spring RMI源码解读

上一篇:UICollectionViewController 实现利用手势滑动选择


下一篇:leetcode Merge Sorted Array 2.19 难度系数2