最近整理資料,發(fā)現(xiàn)關(guān)于Spring RMI接口的一些資料,是關(guān)于RMI接口服務(wù)端重啟會影響客戶端的一些問題,曾經(jīng)我們的項(xiàng)目采用RMI的接口進(jìn)行服務(wù)器與服務(wù)器端的通訊,后來發(fā)現(xiàn)當(dāng)服務(wù)器端修改東西重啟之后,客戶端就訪問不到服務(wù)器端,當(dāng)時(shí)一直糾結(jié)這個(gè)問題是怎么引起的,后來查了一些資料,發(fā)現(xiàn),RMI客戶客戶端與服務(wù)端第一次建立連接的時(shí)候會在客戶端生成一個(gè)stub,我們稱之為存根,并且在服務(wù)端注冊,以后RMI服務(wù)端與客戶端都會基于這個(gè)文件進(jìn)行通訊,當(dāng)客戶端需要訪問服務(wù)端的時(shí)候會首先掃描這個(gè)文件,然后訪問客戶端,當(dāng)客戶端驗(yàn)證的時(shí)候發(fā)現(xiàn)注冊了就會通過,如果發(fā)現(xiàn)沒有注冊就會拒絕本次訪問,所以當(dāng)服務(wù)端重啟之后,曾經(jīng)所有stub注冊都會失效,所以客戶端會一直訪問不到客戶端,必須重新啟動,以獲取新的stub,不過RMI接口下有避免這種情況的相關(guān)配置,配置如下:
<bean id="yourRMIService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceUrl" value="${app.remoting.url}" />
<property name="serviceInterface" value="${app.remoting.serviceInterface}" />
<!-- 連接出錯時(shí)自動重連 -->
<property name="refreshStubOnConnectFailure" value="true" />
<!-- 不在容器啟動的時(shí)候創(chuàng)建與Server端的連接 -->
<property name="lookupStubOnStartup" value="false" />
</bean>
如上配置之后,當(dāng)服務(wù)端重啟之后,客戶端訪問不到服務(wù)端時(shí),會自動去重新獲取stub,這樣就可以實(shí)現(xiàn)服務(wù)器端重啟之后,不會影響到客戶端了,這樣可以給相關(guān)的系統(tǒng)減少很大的風(fēng)險(xiǎn)與麻煩。