(轉載)springboot集成httpinvoker的客戶端

原文:https://blog.csdn.net/geanwan/article/details/51505679html

因爲新項目採用了springboot,須要調用以前遠程服務(以前項目用的spring的httpinvoker),現說明下在springboot下配置httpinvoker的客戶端使用,其中會穿插基於spring3的httpinvoker的配置,以作對比,關於httpinvoker的服務端的配置後續再更新。java

首先是基於spring3的httpinvoker的客戶端通常配置web

ctx-remote.xmlspring

<bean id="basic-properties" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
 
<property name="locations">
 
<list>
 
<value>classpath:base-service.properties</value>
 
</list>
 
</property>
 
</bean>
 
<bean id="userService" class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
 
<property name="serviceUrl" value="${server.uri}/remoting/invoker/userService" />
 
<property name="serviceInterface" value="com.aa.service.UserService" />
 
<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="1000" />
 
<property name="timeout" value="2000" />
 
<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>

  默認狀況下,客戶端的HttpInvokerProxy使用J2SE的HTTP Client來創建鏈接,即org.springframework.remoting.httpinvoker.SimpleHttpInvokerRequestExecutor,能夠經過設置httpInvokerRequestExecutor屬性來改變默認配置,spring提供了另一種HttpClient,org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor。在HttpClient中使用多線程的一個主要緣由是能夠一次執行多個方法。在執行期間,每個方法都使用一個HttpConnection實例。因爲在同一時間多個鏈接只能安全地用於單一線程和方法和有限的資源,咱們就必須確保鏈接分配給正確的方法。而MultiThreadedHttpConnectionManager徹底能夠代替咱們完成這一項工做,這樣咱們就沒必要去考慮多線程帶來安全的問題。apache

訪問方式api

ApplicationContext applicationContext = new ClassPathXmlApplicationContext( "classpath:ctx-remote.xml" ); service = (UserService) applicationContext.getBean( "userService" );

 相關詳情能夠參考點擊打開連接安全

 

springboot實現httpinvoker的客戶端springboot

因爲springboot是spring4的下一個新項目,無配置化,因此用class文件去描述相關的bean。多線程

HttpInvokerRequestInit.Javaapp

import org.apache.http.client.HttpClient; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.remoting.httpinvoker.HttpComponentsHttpInvokerRequestExecutor; import org.springframework.stereotype.Component; @Component public class HttpInvokerRequestInit { //@Autowired //private MultiThreadedHttpConnectionManager multiThreadedHttpConnectionManager;
 @SuppressWarnings("deprecation") @Bean public HttpComponentsHttpInvokerRequestExecutor httpInvokerRequestExecutor(){ HttpComponentsHttpInvokerRequestExecutor bean = new HttpComponentsHttpInvokerRequestExecutor(); ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(); cm.setMaxTotal(100); HttpClient httpclient = new DefaultHttpClient(cm); //httpClient.setConnectionTimeout(1000); //httpClient.setTimeout(2000);
 bean.setHttpClient(httpclient); return bean; } }

因爲以前的spring3中的CommonsHttpInvokerRequestExecutor在spring4已經不支持了,因此替換成了org.springframework.remoting.httpinvoker.HttpComponentsHttpInvokerRequestExecutor,同時HttpComponentsHttpInvokerRequestExecutor不支持org.apache.commons.httpclient.HttpClient,因此又新增

<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.3.6</version>
</dependency>
這裏用ThreadSafeClientConnManager來替換MultiThreadedHttpConnectionManager,具體能夠查看Apache的API。

RemotingServiceInit.java

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.remoting.httpinvoker.HttpComponentsHttpInvokerRequestExecutor; import org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean; import org.springframework.stereotype.Component; import com.aa.service.UserService; @Component public class RemotingServiceInit { @Value("${spring.remoteurl}") private String remoteurl; @Autowired private HttpComponentsHttpInvokerRequestExecutor httpInvokerRequestExecutor; @Bean public HttpInvokerProxyFactoryBean userService(){ HttpInvokerProxyFactoryBean bean = new HttpInvokerProxyFactoryBean(); bean.setServiceUrl(remoteurl+"/remoting/invoker/userService"); bean.setServiceInterface(UserService.class); bean.setHttpInvokerRequestExecutor(httpInvokerRequestExecutor); return bean; } }

其中serviceurl爲服務端對應的service的聲明的url。還有由於httpinvoker的機制,我在當前工程導入了service和傳輸對象的集合jar包。

調用方式

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import com.aa.bean.User; import com.aa.service.UserService; @Controller public class LoginController { @Autowired private UserService userService; @RequestMapping("/login") public String login(){ User r1 = (User)userService.FetchDataFromServer(); System.out.println(r1.getName()); return "index"; } }

 

 這裏經過spring自動依賴注入的方式獲取userService的實例。

更多參考連接1.http://liuinsect.iteye.com/blog/18862372.http://www.apihome.cn/api/spring/HttpInvokerRequestExecutor.html3.http://www.blogjava.net/wangxinsh55/archive/2012/07/16/383209.html

相關文章
相關標籤/搜索