(转载)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

相关文章
相关标签/搜索