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

由于新项目采用了springboot,需要调用之前远程服务(之前项目用的spring的httpinvoker),现说明下在springboot下配置httpinvoker的客户端使用,其中会穿插基于spring3的httpinvoker的配置,以做对比,关于httpinvoker的服务端的配置后续再更新。

首先是基于spring3的httpinvoker的客户端一般配置

ctx-remote.xml

<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完全可以代替我们完成这一项工作,这样我们就不必去考虑多线程带来安全的问题。

访问方式

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

service = (UserService) applicationContext.getBean( "userService" );

相关详情可以参考点击打开链接

springboot实现httpinvoker的客户端

由于springboot是spring4的下一个新项目,无配置化,所以用class文件去描述相关的bean。

HttpInvokerRequestInit.Java

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/1886237
2.http://www.apihome.cn/api/spring/HttpInvokerRequestExecutor.html
3.http://www.blogjava.net/wangxinsh55/archive/2012/07/16/383209.html

(转载)springboot集成httpinvoker的客户端的更多相关文章

  1. SpringBoot集成Zipkin实现分布式全链路监控

    目录 Zipkin 简介 Springboot 集成 Zipkin 安装启动 zipkin 版本说明 项目结构 工程端口分配 引入 Maven 依赖 配置文件.收集器的设置 编写 Controller ...

  2. springboot集成Kafka

    kafka和MQ的区别: 1)在架构模型方面, RabbitMQ遵循AMQP协议,RabbitMQ的broker由Exchange,Binding,queue组成,其中exchange和binding ...

  3. springboot集成websocket的两种实现方式

    WebSocket跟常规的http协议的区别和优缺点这里大概描述一下 一.websocket与http http协议是用在应用层的协议,他是基于tcp协议的,http协议建立链接也必须要有三次握手才能 ...

  4. springboot集成mybatis(逆向工程),热部署以及整合Swagger2

    本文是作者原创,版权归作者所有.若要转载,请注明出处. springboot集成mybatis和mybatis-generator插件 1.新建Springboot项目(略) 2.导入相关依赖 < ...

  5. 【springBoot】springBoot集成redis的key,value序列化的相关问题

    使用的是maven工程 springBoot集成redis默认使用的是注解,在官方文档中只需要2步; 1.在pom文件中引入即可 <dependency> <groupId>o ...

  6. SpringBoot集成redis的key,value序列化的相关问题

    使用的是maven工程 springBoot集成redis默认使用的是注解,在官方文档中只需要2步; 1.在pom文件中引入即可 <dependency> <groupId>o ...

  7. Windows环境下springboot集成redis的安装与使用

    一,redis安装 首先我们需要下载Windows版本的redis压缩包地址如下: https://github.com/MicrosoftArchive/redis/releases 连接打开后如下 ...

  8. 基于Springboot集成security、oauth2实现认证鉴权、资源管理

    1.Oauth2简介 OAuth(开放授权)是一个开放标准,允许用户授权第三方移动应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容,OAu ...

  9. 流式大数据计算实践(5)----HBase使用&SpringBoot集成

    一.前言 1.上文中我们搭建好了一套HBase集群环境,这一文我们学习一下HBase的基本操作和客户端API的使用 二.shell操作 先通过命令进入HBase的命令行操作 /work/soft/hb ...

随机推荐

  1. 《黑白团团队》第八次团队作业:Alpha冲刺 第四天

    项目 内容 作业课程地址 任课教师首页链接 作业要求 团队项目 填写团队名称 黑白团团队 填写具体目标 认真负责,完成项目 团队项目Github仓库地址链接. 第四天 日期:2019/6/18 成员 ...

  2. Python中图像的缩放 resize()函数的应用

    cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) -> dst 参数说明: src - 原图 dst - 目标图像.当参数ds ...

  3. Python - 采用 contextmanage 简化代码

    contextlib.contextmanage Python 2.7 documents: https://docs.python.org/2.7/library/contextlib.html?h ...

  4. easy-ui采坑事件

    新用户首次登陆修改密码 imput标签中使用easyui自带的class="easyui-passwordbox"可以是密码隐藏变成黑点但是无法禁用输入法,然后果断的加了一个typ ...

  5. java map实现二级联动查询(省市区下拉列表查询)

    1.Map集合可以保存键值映射关系,这非常适合本实例所需要的数据结构,所有省份信息可以保存为Map集合的键,而每个键可以保存对应的城市信息,本实例就是利用Map集合实现了省市级联选择框,当选择省份信息 ...

  6. [SharePoint2010开发入门经典]11、与Office集成

    本章概要: 1.创建office集成解决方案使用代码或非代码形式 2.使用内容类型作为能映射到文档库的文档 3.使用InfoPath管理表单 4.使用工作流管理业务流程 5.使用office2010服 ...

  7. 在WPF的MVVM框架中获取下拉选择列表中的选中项

    文章概述: 本演示介绍怎样在WPF的MVVM框架中.通过数据绑定的方式获取下拉列表中的选中项.程序执行后的效果例如以下图所看到的: 相关下载(代码.屏幕录像):http://pan.baidu.com ...

  8. UVa11183 - Teen Girl Squad(最小树形图-裸)

    Problem I Teen Girl Squad  Input: Standard Input Output: Standard Output -- 3 spring rolls please. - ...

  9. Google C++ style guide——格式

    1.行长度 每一行代码字符数不超过80. 例外: 1)假设一行凝视包括了超过80字符的命令或URL,出于复制粘贴的方便能够超过80字符: 2)包括长路径的能够超出80列,尽量避免: 3)头文件保护能够 ...

  10. .NET开源的背后:是无奈,还是顺应潮流?

    摘要:微软.NET的开源,让很多开发者欣喜若狂.同一时候也有很多人好奇其背后的故事,过去视开源为癌症的微软为什么会突然有这一举措,是出于无奈,还是顺应潮流,而这当中的种种也许能够用文中的六个观点来说明 ...