最近整理资料,发现关于Spring RMI接口的一些资料,是关于RMI接口服务端重启会影响客户端的一些问题,曾经我们的项目采用RMI的接口进行服务器与服务器端的通讯,后来发现当服务器端修改东西重启之后,客户端就访问不到服务器端,当时一直纠结这个问题是怎么引起的,后来查了一些资料,发现,RMI客户客户端与服务端第一次建立连接的时候会在客户端生成一个stub,我们称之为存根,并且在服务端注册,以后RMI服务端与客户端都会基于这个文件进行通讯,当客户端需要访问服务端的时候会首先扫描这个文件,然后访问客户端,当客户端验证的时候发现注册了就会通过,如果发现没有注册就会拒绝本次访问,所以当服务端重启之后,曾经所有stub注册都会失效,所以客户端会一直访问不到客户端,必须重新启动,以获取新的stub,不过RMI接口下有避免这种情况的相关配置,配置如下:
<bean id="yourRMIService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceUrl" value="${app.remoting.url}" />
<property name="serviceInterface" value="${app.remoting.serviceInterface}" />
<!-- 连接出错时自动重连 -->
<property name="refreshStubOnConnectFailure" value="true" />
<!-- 不在容器启动的时候创建与Server端的连接 -->
<property name="lookupStubOnStartup" value="false" />
</bean>
如上配置之后,当服务端重启之后,客户端访问不到服务端时,会自动去重新获取stub,这样就可以实现服务器端重启之后,不会影响到客户端了,这样可以给相关的系统减少很大的风险与麻烦。