http://zhidao.baidu.com/link?url=6FrnwvBQEZhjM-ooNCuiAra7T6qi9FsFhFvkHBKaOjqovZR86OCsIePi-05nM-fxRrlInEGbElSxlhgO6X7JsaGNdQdNrQ2xE58wglgeQO3
http://blog.csdn.net/liaq325/article/details/8281550
摘自以上
spring httpInvoke
spring httpInvoke 基于spring架構的服務器之間的遠程調用實現。通過spring httpInvoke,可以調用遠程接口,進行數據交互、業務邏輯操作
服務器端:(被調用一方)
- public class User implements Serializable{//必須實現serializable接口,遠程調用的基礎
- private String username;
- private Date birthday;
- //構造方法
- //set get 方法
- }
- public interface UserService{
- User getUser(String username);
- }
- public UserServiceImpl implements UserService{
- //實現userService
- }
重要的配置文件來了。。。。remote-servlet.xml放在項目根目錄下面,跟web.xml相同的級別暴露給調用端:服務的實現,接口
- <bean id="userService" class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
- <property name="service">
- <bean class="com.cd.Liaq.UserServiceImpl"/>
- </property>
- <property name="serviceInterface">
- <value>com.cd.Liaq.UserService</value>
- </property>
- </bean>
暴露了服務的實現和接口,那么怎么訪問服務呢?spring封裝訪問url- <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
- 第一種:<property name="urlMap">
- <map>
- <entry key="TestUser" value-ref="userService"/>
- </map>
- </property>
- 第二種:<prop key="/TestUser">userService</prop>
- </bean>
web.xml:配置dispatcherServlet共調用一方使用- <!-- spring遠程調用 -->
- <servlet>
- <servlet-name>remote</servlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>remote</servlet-name>
- <url-pattern>/remoting/*</url-pattern>
- </servlet-mapping>
到處為止:被調用端一方完畢!!!!客戶端調用:- <!-- 通過http連接遠程系統 -->
- <bean id="memberService"
- class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
- <property name="serviceUrl">
- <value>http://192.9.200.123:8080/MemberSystem/remoting/memberService</value>
- </property>
- <property name="serviceInterface">
- <value>com.cd.Liaq.UserService</value>
- </property>
- </bean>
通過spring容器調用UserService,用到HttpInvokerProxyFactoryBean工廠,配置serviceUrl和serviceInterface為了提高效率:客戶端使用Commons-HttpClient,導入改包,改寫配置- <bean id="memberService"
- class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
- <property name="serviceUrl">
- <value>http://192.9.200.123:8080/MemberSystem/remoting/memberService</value>
- </property>
- <property name="serviceInterface">
- <value>com.cd.Liaq.UserService</value>
- </property>
- <property name="httpInvokerRequestExecutor"> //使用指定的執行器執行
- <ref bean="httpInvokerRequestExecutor" />
- </property>
- </bean>
- <bean id="httpInvokerRequestExecutor" class="org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor">
- <property name="httpClient">
- <bean class="org.apache.commons.httpclient.HttpClient">
- <property name="connectionTimeout" value="2000" />
- <property name="timeout" value="5000" />
- </bean>
- </property>
- </bean>
配置超時時間timeout和連接超時connectionTimeout兩個屬性優化執行器:多線程===被調用端響應時間縮短很多- <bean id="httpInvokerRequestExecutor" class="org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor">
- <property name="httpClient">
- <bean class="org.apache.commons.httpclient.HttpClient">
- <property name="connectionTimeout" value="2000" />
- <property name="timeout" value="5000" />
- <property name="httpConnectionManager">//控制連接
- <ref bean="multiThreadedHttpConnectionManager" />
- </property>
- </bean>
- </property>
- </bean>
- <bean id="multiThreadedHttpConnectionManager" class="org.apache.commons.httpclient.MultiThreadedHttpConnectionManager">
- <property name="params">
- <bean class="org.apache.commons.httpclient.params.HttpConnectionManagerParams">
- <property name="maxTotalConnections" value="600" />
- <property name="defaultMaxConnectionsPerHost" value="512" />
- </bean>
- </property>
- </bean>
httpClient的3.1版本不支持這種配置- <property name="connectionTimeout" value="2000" />
- <property name="timeout" value="5000" />
另外httpClient本身也是多線程的。。HttpClient that uses a default MultiThreadedHttpConnectionManage<bean class="org.apache.commons.httpclient.params.HttpConnectionManagerParams"> <property name="maxTotalConnections" value="600" /> <property name="defaultMaxConnectionsPerHost" value="512" /> </bean> maxConnectionsPerHost 每個主機的最大并行鏈接數,默認為2 public static final int DEFAULT_MAX_HOST_CONNECTIONS = 2; maxTotalConnections 客戶端總并行鏈接最大數,默認為20 public static final int DEFAULT_MAX_TOTAL_CONNECTIONS = 20;