RestTemplate 连接池最大链接数
2024-10-21 11:37:45
原文链接:https://www.cnblogs.com/x-x-736880382/p/11591906.html
以前我们项目都是基于Apache HttpClient 连接池进行web 接口调用,后来用spring-boot, 发现 RestTemplate 挺好用。
简单介绍下:
什么是RestTemplate?
RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。
调用RestTemplate的默认构造函数,RestTemplate对象在底层通过使用java.net包下的实现创建HTTP 请求,可以通过使用ClientHttpRequestFactory指定不同的HTTP请求方式。
ClientHttpRequestFactory接口主要提供了两种实现方式
一种是SimpleClientHttpRequestFactory,使用J2SE提供的方式(既java.net包提供的方式)创建底层的Http请求连接。
第二种方式是使用HttpComponentsClientHttpRequestFactory方式,底层使用HttpClient访问远程的Http服务,使用HttpClient可以配置连接池和证书等信息。
RestTemplate默认是使用SimpleClientHttpRequestFactory,内部是调用jdk的HttpConnection,默认超时为-1
下面我介绍下spring-boot 如何配置RestTemplate连接池(github):
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate; @Configuration
public class RestTemplateConfig { @Bean
public RestTemplate restTemplate() {
return new RestTemplate(httpRequestFactory());
} @Bean
public ClientHttpRequestFactory httpRequestFactory() { return new HttpComponentsClientHttpRequestFactory(httpClient()); } @Bean
public HttpClient httpClient() {
Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", PlainConnectionSocketFactory.getSocketFactory())
.register("https", SSLConnectionSocketFactory.getSocketFactory())
.build();
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry);
//设置整个连接池最大连接数 根据自己的场景决定
connectionManager.setMaxTotal(200);
//路由是对maxTotal的细分
connectionManager.setDefaultMaxPerRoute(100);
RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(10000) //服务器返回数据(response)的时间,超过该时间抛出read timeout
.setConnectTimeout(5000)//连接上服务器(握手成功)的时间,超出该时间抛出connect timeout
.setConnectionRequestTimeout(1000)//从连接池中获取连接的超时时间,超过该时间未拿到可用连接,会抛出org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool
.build();
return HttpClientBuilder.create()
.setDefaultRequestConfig(requestConfig)
.setConnectionManager(connectionManager)
.build();
}
}
最新文章
- linux下添加mysql用户并授权
- Jquery ajax提交表单几种方法
- Unity3D 文字滚动跑马灯效果
- (转)innerHTML、innerText和outerHTML、outerText的区别
- Java读取图片并修改像素,创建图片
- On Memory Leaks in Java and in Android.
- C++工厂方法模式
- 求解释一个蛋疼的bug
- 自己封装的一个js方法用于获取显示的星期和日期时间
- Caused by: java.lang.ClassNotFoundException: flex.messaging.io.BeanProxy
- 升级 mysql5.6 配置文件my.cnf sql_mode 解析与设置问题
- C# Task.Run 和 Task.Factory.StartNew 区别
- mac下编译node源码
- SQL Server -- 回忆笔记(一):初见数据库
- test6
- php中DateTime、diff
- Demo005 小学四则运算自动生成程序
- 让人一看就懂的excel相对引用和绝对引用案例解析
- bzoj 2752
- git一些命令
热门文章
- Git上手教程
- 2.2 在resources目录下,新建applicationContext.xml
- 只会Jquery,后端程序员如何学会前端(webpack,react,babel,es5,es6)
- PHP中的超级变量
- quasar+vue、Input组件绑定两个值
- linux启用ipv4转发功能
- C++ 手动创建二叉树,并实现前序、中序、后序、层次遍历
- shell脚本自动过滤尝试多次连接ip并添加到系统黑名单
- 在端点0由GET_REPORT类请求上传报表
- rabbitMq客户端连接超时