RMI解耦生命周期

在使用 RMI的时候,发现生命周期绑定,在中止了下级服务重启的时候,上级也要跟着重启,不然连不上。如下是找到的处理办法  spring

一、设置refreshStubOnConnectFailure自动重连 缓存

二、设置lookupStubOnStarup将链接缓存 服务器



由于RMI stub被链接到特定的端点,不单单是为每一个调用打开一个给定的目标地址的链接,因此若是从新启动RMI端点主机的服务器,那么就须要从新注册这些stub,而且客户端须要再次查询它们。 性能

     虽然目标服务的从新注册在从新启动时一般会自动发生,不过此时客户端保持的stub将会变的陈旧,且客户端不会注意这些,除非他们再次尝试调用stub上的方法,而这也将throw一个链接失败的异常。
      为了不这种情形,Spring的RmiProxyFactoryBean提供了一个refreshStubOnConnectFailure的bean属性,若是调用失败,而且链接异常的话,将它设定为true来强制从新自动查询stub。
<bean id="reportService"
  class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
  <property name="serviceUrl">
   <value>${showcasewiz.report.serviceurl}</value>
  </property>
  <property name="serviceInterface">
   <value>com.meetexpo.showcase.backend.service.ReportService</value>
  </property>
  <property name="refreshStubOnConnectFailure">
    <value>true</value>
  </property>
 </bean>
      stub查询的另外一个问题是,目标RMI服务器和RMI注册项在查询时要为可用的。若是客户端在服务器启动以前,尝试查询和缓存该服务stub,那么客户端的启动将会失败(即便还不须要该服务)。
     为了可以惰性查询服务stub,设定RmiProxyFactoryBean的lookupStubOnStarup标志为false。而后在第一次访问时查询该stub,也就是说,当代理上的第一个方法被调用的时候去主动查询stub,同时被缓存。这也有一个缺点,就是直到第一次调用,不然没法确认目标服务是否实际存在。
<bean id="reportService"
  class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
  <property name="serviceUrl">
   <value>${showcasewiz.report.serviceurl}</value>
  </property>
  <property name="serviceInterface">
   <value>com.meetexpo.showcase.backend.service.ReportService</value>
  </property>
  <property name="lookupStubOnStartup">
     <value>false</value>
  </property>
  <property name="refreshStubOnConnectFailure">
    <value>true</value>
  </property>
 </bean>
 
还有一个属性就是cacheStub,当它设置为false的时候,就彻底避免了stub的缓存,但影响了性能。须要的时候仍是能够试试。
 
利用上面的配置最大的优势是将客户端和服务器端的生命周期尽量的去耦,我想在项目中应该会用的到的。
相关文章
相关标签/搜索