在使用 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的緩存,但影響了性能。須要的時候仍是能夠試試。
利用上面的配置最大的優勢是將客戶端和服務器端的生命週期儘量的去耦,我想在項目中應該會用的到的。