SpringRMI源码解读
作者:李红序,转载时请指明作者出处 QQ群号: JAVA高级技术交流(215597268)
1. RMI服务端源代码解读
Spring的RMI服务发布是通过RmiServiceExporter类来实现。RmiServiceExporter的类图结果如下:
当Spring容器启动时,RmiServiceExporter 的prepare方法就会被调用,来完成Rmi 服务的发布工作。代码解读如下:
prepare 方法流程如下:
1. 获取RMI的 Register对象,来实现端口服务的注册
2. 获取发布服务的对象 getObjectToExport
根据发布服务的接口的类型来确定使用Wrapper包装发布或直接接口发布。
3. 使用UnicastRemoteObject发布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 容器启动时,RmiProxyFactoryBean 的afterPropertiesSet 方法就会被调用,
来完成Rmi 服务端口端的代理功能。代码解读如下:
1. 创建代理对象
2. 当代理对象的方法被调用时,会触发invoke 方法
getStub 方法,是进行RMI 服务调用,获取RMI 服务对象。
doInvoke方法是通过获取的RMI服务对象,进行方法的反射调用
doInvoke方法根据RMI服务对象的类型,进行判断。
下面是根据Spring的Wrapper封状的服务时
下面是普通的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