遠程調用RMI(Remote Method Invocation): 經過使用RmiProxyFactoryBean 和 RmiServiceExporter,而且,Spring支持兩個傳統的RMI(使用 java.rmi.Remote接口和java.rmi.RemoteException)和經過RMI調用器實現的暴露遠程調用(支持任何Java接口)。java
1). 服務端定義遠程訪問接口;spring
2). 服務端經過RmiServiceExporter暴露服務接口緩存
3). 客戶端定義與服務端已暴露的相同接口服務器
4). 客戶端經過RmiProxyFactoryBean調用服務接口app
1.客戶端配置三步:ide
1)applicationContext.xml測試
<!-- spring rmi遠程接口調用 客戶端調用-->
<bean id="clientRmi" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceUrl" value="rmi://localhost:1199/userRmiService"></property>
<property name="serviceInterface" value="com.maystar.common.service.RmiUserService"></property>
<!-- 注意:若是以下兩項不配置,當服務器未開啓,客戶端沒法打包,會有拒絕鏈接異常。 -->
<!-- 預查找遠程對象 默認爲true -->
<property name="lookupStubOnStartup" value="false"></property>
<!-- 是否刷新遠程調用緩存的stub -->
<property name="refreshStubOnConnectFailure" value="true"></property>
</bean>spa
2)接口:.net
public interface RmiUserService {
User getUserByAcount(String name,String password);
void insert(User user);
}xml
3)調用
//測試rmi遠程接口調用代碼
System.out.println("rmi客戶端開始調用");
RmiUserService rmiUserService=(RmiUserService)SpringContextUtil.getBean("clientRmi");
User list=(User)rmiUserService.getUserByAcount("張三", ":張三的密碼");//spring實現反序列化
System.out.println(list);
System.out.println("rmi客戶端調用結束");
2.服務器端配置
1)applicationContext.xml
<!-- spring rmi遠程接口調用 服務端配置-->
<bean name="rmiService" class="com.maystar.common.service.UserRmiServiceImpl"/>
<bean class="org.springframework.remoting.rmi.RmiServiceExporter">
<!-- RMI服務名稱,可自定義服務名稱 -->
<property name="serviceName" value="userRmiService" ></property>
<!-- 導出實體 -->
<property name="service" ref="rmiService" ></property>
<property name="serviceInterface" value="com.maystar.common.service.RmiUserService"></property>
<property name="registryPort" value="1199" ></property>
</bean>
2)接口(同客戶端一致)
public interface RmiUserService {
User getUserByAcount(String name,String password);
void insert(User user);
}
3)接口實現類
public class UserRmiServiceImpl implements RmiUserService{
@Override
public User getUserByAcount(String name, String password) {
System.out.println("服務端獲取用戶信息:" + name + password);
User user=new User();
user.setUsername(name);
user.setPassword(password);
return user;
}
@Override
public void insert(User user) {
System.out.println("開始插入用戶信息:" + user.toString());
}
}
輸出結果:
rmi客戶端開始調用 張三 :張三的密碼 rmi客戶端調用結束