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 很…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...

搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
React核心概念:State是什么?如何用useState管理组件自己的数据?
系列回顾: 在上一篇《React入门第一步》中,我们已经成功创建并运行了第一个React项目。我们学会了用Vite初始化项目,并修改了App.jsx组件,让页面显示出我们想要的文字。但是,那个页面是“死”的,它只是静态…...

EasyRTC音视频实时通话功能在WebRTC与智能硬件整合中的应用与优势
一、WebRTC与智能硬件整合趋势 随着物联网和实时通信需求的爆发式增长,WebRTC作为开源实时通信技术,为浏览器与移动应用提供免插件的音视频通信能力,在智能硬件领域的融合应用已成必然趋势。智能硬件不再局限于单一功能,对实时…...

表单设计器拖拽对象时添加属性
背景:因为项目需要。自写设计器。遇到的坑在此记录 使用的拖拽组件时vuedraggable。下面放上局部示例截图。 坑1。draggable标签在拖拽时可以获取到被拖拽的对象属性定义 要使用 :clone, 而不是clone。我想应该是因为draggable标签比较特。另外在使用**:clone时要将…...