Spring 學習筆記(七)——遠程服務

一、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 序列化機制

3.1 發佈 HttpInvoker 服務
<!-- 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>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章