CloseableHttpClient.close() 导致 Connection pool shut down 的问题
TL;DR;
CloseableHttpClient.close()方法默认行为是关闭HttpClientConnectionManager- 如果多个
CloseableHttpClient共用了同一个HttpClientConnectionManager,则第一个请求执行完,其他请求就会爆Connection pool shut down异常 - 备注:httpclient 版本是 4.5.6
1. 背景
某次上线以后,观察到所有的方法调用量都变得特别多,几百倍的增长,但因为当时统一时间段上线逻辑较多,并没有及时定位到问题。
第二天继续排查时,有同事指出 httpclient 连接池 Connection pool shut down 异常增多,于是想到前一天确实使用了相关的方法,代码如下
try {@Cleanup CloseableHttpClient client = Requests.getHttpclient(15000, 15000, 15000, proxyIpInfo);HttpGet httpGet = new HttpGet(url);@Cleanup final CloseableHttpResponse execute = client.execute(httpGet);return EntityUtils.toByteArray(execute.getEntity());
} catch (IOException e) {throw new RuntimeException(e);
}
2. CloseableHttpClient 的 close 方法
CloseableHttpClient 示例是通过如下代码创建的,其中 CONNECTION_MANAGER 是一个全局静态的共用的 HttpClientConnectionManager 实例。
HttpClients.custom().setConnectionManager(CONNECTION_MANAGER).setDefaultRequestConfig(requestConfig).build();
让我们深入 org.apache.http.impl.client.HttpClientBuilder#build 的源码,看一下如何构建 CloseableHttpClient 的 close 方法的,核心代码如下,注意看其中我补充的注释
List<Closeable> closeablesCopy = closeables != null ? new ArrayList<Closeable>(closeables) : null;
// 如果 connManagerShared 属性是 false(默认值)
// 那么其 close 方法的逻辑就是关闭 ConnectionManager
if (!this.connManagerShared) {if (closeablesCopy == null) {closeablesCopy = new ArrayList<Closeable>(1);}final HttpClientConnectionManager cm = connManagerCopy;... ...closeablesCopy.add(new Closeable() {@Overridepublic void close() throws IOException {cm.shutdown();}});
}
3. bug 定位
结合上面两个代码片段,真相已经大白,当 @Cleanup CloseableHttpClient client = Requests.getHttpclient(15000, 15000, 15000, proxyIpInfo); 执行过后,@Cleanup 自动执行 client 的 close 方法,这时关闭了共用的全局静态 ConnectionManager
当其他请求获取 CloseableHttpClient 对象并请求时,ConnectionManager 已经被关闭,遂报出 Connection pool shut down 异常
这一过程速度非常快,导致原来函数执行时间缩短很多。因为一次 http 请求 100ms - 数秒,而检测 ConnectionManager 关闭报错只要几 ms。这进而导致了单位时间内,所有函数的执行次数都飙升的很高。
相关文章:
CloseableHttpClient.close() 导致 Connection pool shut down 的问题
TL;DR; CloseableHttpClient.close() 方法默认行为是关闭 HttpClientConnectionManager如果多个 CloseableHttpClient 共用了同一个 HttpClientConnectionManager,则第一个请求执行完,其他请求就会爆 Connection pool shut down 异常备注:ht…...
centos7 docker空间不足
今天在使用docker安装镜像的时候,出现报错 查看原因,发现是分区空间不足导致的 所以考虑进行扩容 首先在vmware扩容并没有生效 因为只是扩展的虚拟空间,并不支持扩展分区大小,下面对分区进行扩容 参考: 分区扩容 主…...
C#基于SkiaSharp实现印章管理(5)
印章中最常见的特殊形状通常是五角星,空心、实心的都可能存在,本文学习并实现在印章内部绘制五角星形状。 百度五角星的绘制方法,主要分为三种: 1)五角星各点坐标固定,直接调用编程语言的绘制线条或…...
【C#】ThreadPool的使用
1.Thread的使用 Thread的使用参考:【C#】Thread的使用 2.ThreadPool的使用 .NET Framework 和 .NET Core 提供了 System.Threading.ThreadPool 类来帮助开发者以一种高效的方式管理线程。ThreadPool 是一个线程池,它能够根据需要动态地分配和回收线程…...
【Python系列】Python 中`eval()`函数的正确使用及其风险分析
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
使用Spring Boot开发应用:基于请求参数MD5的缓存键及其他缓存方式
本文将介绍如何在Spring Boot应用中实现基于请求参数MD5的缓存键,以及其他常见的缓存方式。通过实际代码示例,展示如何应用这些技术优化系统性能。 1. 引入必要的依赖 首先,在Spring Boot项目中引入缓存相关的依赖。修改pom.xml文件&#x…...
typescript中interface常见3种用法
文章目录 函数类型对象类型【自命名】: (函数)对象类型 函数类型 作用:声明一个函数接口:可用于类型声明 | 不可implements 对象类型 作用:声明对象具备哪些实例接口:可用于类型 | 可implements 【自命名】&…...
windows10 安装CUDA教程
如何在windows10系统上安装CUDA? 1、查看电脑的NVIDIA版本 nvidia-smi 2、官网下载所需CUDA版本 官网地址:https://developer.nvidia.com/cuda-toolkit-archive 我们所安装的CUDA版本需要小于等于本机电脑的NVIDIA版本。推荐使用迅雷下载,速度会更快哦。 3、安装步骤...
计算机毕业设计选题推荐-某炼油厂盲板管理系统-Java/Python项目实战
✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…...
PSO求解函数最小值的MATLAB例程|MATLAB源代码
本篇文章适合PSO入门,进阶的可能会觉得太简单的。 目录 PSO例程作用运行结果代码函数解释 例程修改tips PSO Particle Swarm Optimization,粒子群优化算法,通过模拟鸟群或鱼群的行为来寻找最优解。在计算时通过对一群粒子的位置和速度进行迭…...
scrapy 爬取旅游景点相关数据(一)
配套视频可以前往B站:麦麦大数据 项目目标: 爬取的是穷游旅游景点列表 、评论数据 📊 章节: 😆 Scrapy 爬取旅游景点相关数据(一) 😆 Scrapy 爬取旅游景点相关数据(二) &…...
构建铁塔基站安全防护网:视频AI智能监控技术引领智慧化转型
一、背景现状 随着通信技术的快速发展,铁塔基站作为重要的通信基础设施,其安全、稳定、高效的运行对于保障通信网络的畅通至关重要。然而,铁塔基站大多分布在公路边、高山、野外等区域,巡检难度大,维护效率低…...
Java中的分布式缓存:Ehcache与Hazelcast
Java中的分布式缓存:Ehcache与Hazelcast 大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨Java中的两种分布式缓存技术:Ehcache与Hazelcast。分布式缓存可以显…...
前端开发工程师的薪资,主要取决于哪3个方面?
作者:清水束竹 从2022年开始,互联网行业的就业情况就不容乐观了。 最明显的三个表现:裁员、缩招、降薪。 其实2021-2022年年中那段时间,互联网企业出现了一波假性繁荣。 某些大厂Q大量招聘应届毕业生,宣传铺天盖地,不…...
springboot美食网站—计算机毕业设计源码11574
摘 要 随着人们生活水平的提高,人们对美食的要求也越来越高,对各类美食信息需求越来越大。因此,结合计算机快速发展、普及,在此基础上制作一个页面简单、美观,功能实用的美食网站势在必行,满足用户分享美食的需求。 美…...
WordPress建站:如何使用ChemiCloud搭建外贸独立站
以前自行搭建一个网站,不懂一点技术那是很难完成的,现如今WordPress的出现极大地降低了搭建网站的技术门槛,不需要懂任何代码,只需按步骤操作就行。WordPress 是一个非常流行的开源内容管理系统(CMS)&#…...
在 Vim 编辑器中,如果某个单词被意外地高亮显示,使用:noh可以取消高亮显示
文章目录 1、问题出现的背景2、解决办法 1、问题出现的背景 配置镜像加速器,修改 /etc/docker/daemon.json 目录下的文件,不小心高亮显示https,产生问题的步骤是,我先是按esc键退出vim的编辑模式,然后在https的前面按…...
一条命令安装mysql,php
一条命令安装mysql,php,wget http://soft.vpser.net/lnmp/lnmp1.5.tar.gz -cO lnmp1.5.tar.gz && tar zxf lnmp1.5.tar.gz && cd lnmp1.5 && ./install.sh lnmp...
配置maven环境
一、把maven文件下载到D盘下 二、创建一个maven文件夹,并在其中创建一个repository文件夹 三、桌面右键单击属性设置,搜索环境 添加MAVEN HOME变量,让然后把apache-maven路径下的bin文件的路径复制进来 用记事本或者NotePad打开下图路径的set…...
飞书打卡 快捷指令
使用快捷指令定时飞书打卡 在网上找了一圈,只有钉钉打卡的快捷指令,但是公司换飞书,哪个打工人不怕忘记打卡呢,所以自己研究了一下,其实也很简单。 找url 问题的最关键是打开飞书的打卡界面 如果只是打开飞书APP 很…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...
DiscuzX3.5发帖json api
参考文章:PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下,适配我自己的需求 有一个站点存在多个采集站,我想通过主站拿标题,采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...
React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构
React 实战项目:微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇!在前 29 篇文章中,我们从 React 的基础概念逐步深入到高级技巧,涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...
uni-app学习笔记三十五--扩展组件的安装和使用
由于内置组件不能满足日常开发需要,uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件,需要安装才能使用。 一、安装扩展插件 安装方法: 1.访问uniapp官方文档组件部分:组件使用的入门教程 | uni-app官网 点击左侧…...
