一、Spring 遠程服務
1. RMI
1.1 發佈 RMI 服務
<bean id="accountService" class="example.AccountServiceImpl">
<!-- any additional properties, maybe a DAO? -->
</bean>
<bean class="org.springframework.remoting.rmi.RmiServiceExporter">
<!-- does not necessarily have to be the same name as the bean to be exported -->
<property name="serviceName" value="AccountService"/>
<property name="service" ref="accountService"/>
<property name="serviceInterface" value="example.AccountService"/>
<!-- 默認情況下,綁定到本機的1099端口,可以設置將 RMI 綁定到指定主機 -->
<property name="registryHost" value="rmi.spitter.com" />
<!-- 綁定端口,默認 1099 -->
<property name="registryPort" value="1199"/>
</bean>
1.2 在客戶端連接 RMI<bean id="accountService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceUrl" value="rmi://localhost:1199/AccountService"/>
<property name="serviceInterface" value="example.AccountService"/>
</bean>
2. Hessian、Burlap
2.1 發佈 Hessian 服務
<!-- 配置 Spring MVC -->
<servlet>
<servlet-name>remoting</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>remoting</servlet-name>
<url-pattern>/remoting/*</url-pattern>
</servlet-mapping>
使用 HessianServiceExporter 創建 Hessian Service bean<!-- 在 /WEB-INF/ 下創建 remoting-servlet.xml -->
<bean id="accountService" class="example.AccountServiceImpl">
<!-- any additional properties, maybe a DAO? -->
</bean>
<!-- 根據 bean 的 name 屬性指定調用服務的 URL,<code class="literal">'http://HOST:8080/remoting/AccountService'</code>. -->
<bean name="/AccountService" class="org.springframework.remoting.caucho.HessianServiceExporter">
<property name="service" ref="accountService"/>
<property name="serviceInterface" value="example.AccountService"/>
</bean>
也可以通過 web.xml 中配置服務 URL,並在 applicationContext.xml 文件中配置 Service bean<servlet>
<servlet-name>accountExporter</servlet-name>
<servlet-class>org.springframework.web.context.support.HttpRequestHandlerServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>accountExporter</servlet-name>
<url-pattern>/remoting/AccountService</url-pattern>
</servlet-mapping>
<bean name="accountExporter" class="org.springframework.remoting.caucho.HessianServiceExporter">
<property name="service" ref="accountService"/>
<property name="serviceInterface" value="example.AccountService"/>
</bean>
2.2 客戶端調用 Hessian
<bean class="example.SimpleObject">
<property name="accountService" ref="accountService"/>
</bean>
<bean id="accountService" class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
<property name="serviceUrl" value="http://remotehost:8080/remoting/AccountService"/>
<property name="serviceInterface" value="example.AccountService"/>
</bean>
Burlap 與 Hessian 都是基於 HTTP 協議的,Just replace the word Hessian
withBurlap
and you’re all set to go.3. HttpInvoker
HttpInvoker 基於 HTTP 協議並使用 Java 序列化機制
<!-- HttpInvoker 創建服務的配置與 Hessian、Burlap 一致 -->
<servlet>
<servlet-name>remoting</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>remoting</servlet-name>
<url-pattern>/remoting/*</url-pattern>
</servlet-mapping>
<bean name="/AccountService" class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
<property name="service" ref="accountService"/>
<property name="serviceInterface" value="example.AccountService"/>
</bean>
3.2 客戶端調用 HttpInvoker 服務<bean id="httpInvokerProxy" class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
<property name="serviceUrl" value="http://remotehost:8080/remoting/AccountService"/>
<property name="serviceInterface" value="example.AccountService"/>
<!-- 可以設置使用哪種 httpclient 進行連接,默認是 JavaSE HTTP 功能 -->
<property name="httpInvokerRequestExecutor">
<bean class="org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor"/>
</property>
</bean>
4. WebService
4.1 發佈 WebService
import org.springframework.web.context.support.SpringBeanAutowiringSupport;
/**
繼承 SpringBeanAutowiringSupport 爲了可以自動裝配需要用的其它類,來實現邏輯
*/
@WebService(serviceName="AccountService")
public class AccountServiceEndpoint extends SpringBeanAutowiringSupport {
@Autowired
private AccountService biz;
@WebMethod
public void insertAccount(Account acc) {
biz.insertAccount(acc);
}
@WebMethod
public Account[] getAccounts(String name) {
return biz.getAccounts(name);
}
}
SimpleJaxWsServiceExporter 開始工作時會自動掃描 @Webservice 註解的 bean,如果你的 WebService 類是標準的 bean,那不需要繼承 SpringBeanAutowiringSupport 類也可以實現自動裝配<bean class="org.springframework.remoting.jaxws.SimpleJaxWsServiceExporter">
<property name="baseAddress" value="http://localhost:8080/"/>
</bean>
<bean id="accountServiceEndpoint" class="example.AccountServiceEndpoint">
...
</bean>
...
4.2 客戶端調用 WebService<bean id="accountWebService" class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean">
<property name="serviceInterface" value="example.AccountService"/>
<property name="wsdlDocumentUrl" value="http://localhost:8888/AccountServiceEndpoint?WSDL"/>
<property name="namespaceUri" value="http://example/"/>
<property name="serviceName" value="AccountService"/>
<property name="portName" value="AccountServiceEndpointPort"/>
</bean>
<bean id="client" class="example.AccountClientImpl">
...
<property name="service" ref="accountWebService"/>
</bean>