关于httpClient 使用的注意事项

news2024/12/30 2:02:20

关于httpClient 使用的注意事项

用例
        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
        // 最大连接数-不设置默认20
        connectionManager.setMaxTotal(200);
        // 每个路由最大连接数-不设置默认2
        connectionManager.setDefaultMaxPerRoute(100);
        CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(
                        RequestConfig.custom()
                                // 连接服务器(握手)的超时时间
                                .setConnectTimeout(3000)
                                // 被请求服务器响应(response)的超时时间
                                .setSocketTimeout(5000)
                                // 从连接池中获取连接的超时时间
                                .setConnectionRequestTimeout(3000)
                                .build()
                ).setConnectionManager(connectionManager)
                .build();
三个连接超时时间
  1. connectionRequestTimeout:从连接池中获取连接的超时时间,超过该时间未拿到可用连接,会抛出ConnectionPoolTimeoutException: Timeout waiting for connection from pool
  2. connectTimeout:连接上服务器(握手成功)的时间,超出该时间抛出connect timeout
  3. socketTimeout:服务器返回数据(response)的时间,超过该时间抛出read timeout
连接池的大小

如果使用默认配置,连接池大小默认为20,即假设被请求接口响应时间为200ms,我们的程序每秒只能完成100个请求响应,剩余的则会陷入等待从连接池获取连接。则在某些高并发的场景中容易出现问题。

路由的大小

DefaultMaxPerRoute 是什么?

可以理解为 IP+端口的一条通路

例如连接池大小(MaxTotal)设置为300,路由连接数设置为200(DefaultMaxPerRoute),对于www.a.com与www.b.com两个路由每个路由的连接数不能超过200来说,两个路由的总连接数不能超过300。

关于setDefaultMaxPerRoute测试
// 服务端测试接口
@RestController
@RequestMapping("/test")
public class TestController {
    @RequestMapping("doTest")
    public Object test(){
        LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(3));
        return "ok";
    }

    @RequestMapping("doTest1")
    public Object tes1t(){
        LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(3));
        return "ok";
    }
}


// 客户端测试方法
public class ATest {

    public static Logger log = LoggerFactory.getLogger(ATest.class);
    public static void main(String[] args) {

        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
        // 最大连接数-不设置默认20
        connectionManager.setMaxTotal(2);
        // 每个路由最大连接数-不设置默认2
        connectionManager.setDefaultMaxPerRoute(1);
        CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(
                        RequestConfig.custom()
                                // 连接服务器(握手)的超时时间
                                .setConnectTimeout(3000)
                                // 被请求服务器响应(response)的超时时间
                                .setSocketTimeout(50000)
                                // 从连接池中获取连接的超时时间
                                .setConnectionRequestTimeout(50000)
                                .build()
                ).setConnectionManager(connectionManager)
                .build();
        new Thread(()->{
            doGet(httpClient,"http://localhost:8080/test/doTest");
        }).start();
        new Thread(()->{
            doGet(httpClient,"http://localhost:8080/test/doTest1");
        }).start();

    }

    private static void doGet(CloseableHttpClient httpClient,String url) {
        HttpGet httpGet = new HttpGet(url);
        try {
            log.info("start");
            CloseableHttpResponse response = httpClient.execute(httpGet);
            log.info("message={}", EntityUtils.toString(response.getEntity()));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

结果

在这里插入图片描述

配置setDefaultMaxPerRoute value为1 ,即同一个ip+端口只能存在一个连接,服务端模拟请求耗时3s,thread-0在请求3s后完成获得响应,并且我们可以看到thread-1实际是在等待thread-0完成请求释放连接后才开始请求,在请求6s后才获得响应

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1375496.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nginx本地打开vue打包项目

1,首先下载nginx包,然后修改下载的包中的nginx.conf配置文件 其中location后面接的是要增加的域名字段(perbank8),配置项 index index.html 代表入口文件是index.html 这个在vue项目中也要在nginx配置文件中也要配置同样的路径 在vue项目里…

Fluids —— Up-ressing simulations

目录 Low-res setup Hi-res setup 想象需要一个波浪特写镜头,撞击岩石并产生飞溅;通常会模拟大部分周围海洋,以获得波浪运动;最后,可能只需要模拟tank的20%左右; 通常工作流是测试低粒子数的模拟&#xf…

【一文详解】知识分享:(C#开发学习快速入门)

面向对象(OOP) c语言是面向过程。 c是面向过程面向对象。 c#是纯粹的面向对象: 核心思想是以人的思维习惯来分析和解决问题。万物皆对象。 面向对象开发步骤: 分析对象 特征行为关系(对象关系/类关系) 写代码: 特征–>成员变量 方法–>成员方法 实例化–具体对象 …

JS中垃圾数据是如何自动回收的

JS中垃圾数据是如何自动回收的 背景垃圾回收机制调用栈中的数据回收堆空间中数据回收垃圾回收器的工作流程副垃圾回收器主垃圾回收器 全停顿 背景 在JS栈和堆:数据是如何存储的一文中提到了 JavaScript 中的数据是如何存储的,并通过示例代码分析了原始数…

基于Java SSM框架实现雁门关风景区宣传网站项目【项目源码】

基于java的SSM框架实现雁门关风景区宣传网站演示 Java技术 Java技术它是一个容易让人学会和使用的一门服务器语言。它在编程的过程当中只需要很少的知识就能建立起一个真正的交互站点。对于这个教程来说它并不需要你完全去了解这种语言,只要能快速融入web站点就可以…

盘点2023年我用过的AI大模型,国内也能免费用

大家好,这里是程序员晚枫,今天给大家分享3个我用过的AI工具。 国外的工具这里就不推荐了,推荐了你也不能用。今天只推荐几个国内也能用的。 这些工具的下载链接,我都整理好了,需要的朋友可以在评论区告诉我哟~ 百度…

tailwindcss真的好用吗?

写在前面 今天写一篇关于tailwindcss 的文章,其实这个css技术已经出现很久了,在一些大型项目很多人也已经在用了,虽然不是说必须要会吧,但是没听说过肯定是不行的,他的操作逻辑应该是和unocss差不多,但是今…

MySQL:DML数据操作语言(添加,删除,修改),DDL数据查询语言(条件查询,分组查询,排序查询,分页查询)

目录 1.DML(数据操作语言)1.添加数据2.修改数据3.删除数据 2.DQL(数据查询语言)1.DQL-语法2.基本查询3.条件查询(WHERE)1.语法:2.条件:3.案例: 4.聚合函数1.介绍2.常见聚合函数3.语法4.案例 5.分组查询(GROUP BY&#…

VS2019 C++安装最基本的组件

我是C初学者, 我只想用最基本的C编写程序,不需要MFC。 所以下载了一个离线安装版本放在这里,我自己用的现成的文件。 使用以下命令行创建: 1.C基本组件 不含MFC, 带ATL库 共(1.96G) vs2019.exe --layout d:\vs2019 --lang zh-CN …

C#用string.Replace方法批量替换某一类字符串

目录 一、关于字符串及其操作常识 二、String.Replace 方法 1.重载 2.Replace(Char, Char) 3.Replace(String, String) (1)实例: (2)生成结果: 4.Replace(String, String, StringComparison) 5.…

matlab绘图修改坐标轴数字字体大小及坐标轴自定义间隔设置

一、背景 在matlab使用plot函数绘图后,生成的图片坐标轴数字字体大小及间隔可能并不符合我们的要求,因此需要自定义修改,具体方法如下 二、修改坐标轴数字字体大小 只需添加以下命令即可: set(gca,FontName,Times New Roman,F…

DAPP和APP的区别在哪?

随着科技的飞速发展,我们每天都在与各种应用程序打交道。然而,你是否真正了解DAPP和APP之间的区别呢?本文将为你揭示这两者的核心差异,让你在自媒体平台上脱颖而出。 一、定义与起源 APP,即应用程序,通常指…

C++并发编程实战第2版笔记

文章目录 p19 某个线程只可以join()一次p22 只有当joinable()返回true时才能调用detach()P21 在std::thread对象析构前&#xff0c;必须明确是等待还是分离线程P25 移动语义P25 将类的成员函数设定为线程函数p41 std::mutex和类模板std::lock_guard<> p19 某个线程只可以…

多传感器融合SLAM数学学习历程

多传感器融合SLAM数学学习历程 >>> 流形和流形空间&#xff08;姿态&#xff09; https://blog.csdn.net/professor_Xie/article/details/131911894 fast-lio 带着问题 看知识 欧式空间和流形空间的区别和联系? 基本结构&#xff1a;欧式空间是我们熟悉的传统三维…

胖东来热度持续上升的原因是什么?

胖东来超市胖东来超市是一家知名的连锁超市&#xff0c;以其优质的服务和丰富的商品而闻名。在这个充满竞争的市场中&#xff0c;胖东来超市始终保持着良好的业绩和口碑。那胖东来爆火的原因是什么呢&#xff1f; 1.人性化服务&#xff1a;胖东来超市坚信零售不仅仅是商品的销售…

Linux动态分配IP与正向解析DNS

目录 一、DHCP分配 1. 动态分配 1.1 服务端服务安装 1.2 修改服务端dhcp配置 1.3 修改客户端dhcp&#xff0c;重启查询网卡信息 2. 根据mac固定分配 2.1 修改服务器端dhcp服务配置 2.2 客户端自动获取&#xff0c;查看网卡信息 二、时间同步 1. 手动同步 2. 自动同…

【MySQL】表设计与范式设计

文章目录 一、数据库表设计一对一一对多多对多 二、范式设计第一范式第二范式第三范式BC范式第四范式 一、数据库表设计 一对一 举个例子&#xff0c;比如这里有两张表&#xff0c;用户User表 和 身份信息Info表。 因为一个用户只能有一个身份信息&#xff0c;所以User表和In…

无限创意与自由协作:现可在 Splashtop 上使用 Wacom Bridge 的通用版本

2024年1月9日 加利福尼亚州库比蒂诺和俄勒冈州波特兰 数字笔技术的全球领导者 Wacom 和高性能远程访问解决方案供应商 Splashtop 宣布正式发布 Wacom Bridge 的通用版本&#xff0c;目前可在几个特定国家的 Splashtop Enterprise 和 Splashtop Business Access Performance 产…

AppDesigner滤波器幅度仿真——IIR和FIR二十余种

1、AppDesigner简介 MATLAB Designer为滤波器设计提供了直观而高效的工具。通过该系统&#xff0c;用户可以通过简单的操作&#xff0c;选择不同的滤波器类型和模块&#xff0c;调整输入参数指标&#xff0c;即可实现滤波器的设计和幅值的绘制。这种图形化的设计方式使得即便对…

Hana 实时数据同步优化(3)

简述 CloudCanal 近期对 Hana 源端链路做了新一轮优化&#xff0c;优化点主要来自用户实际场景使用&#xff0c;这篇文章简要做下分享。 本轮优化主要包含: 新增任务级增量表新增增量表定时清理能力新增增量表表结构自动演进能力任务延迟判定优化Hana 1.x 的兼容产品化和文档…