当前位置: 首页 > news >正文

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. CloseableHttpClientclose 方法

CloseableHttpClient 示例是通过如下代码创建的,其中 CONNECTION_MANAGER 是一个全局静态的共用的 HttpClientConnectionManager 实例。

HttpClients.custom().setConnectionManager(CONNECTION_MANAGER).setDefaultRequestConfig(requestConfig).build();

让我们深入 org.apache.http.impl.client.HttpClientBuilder#build 的源码,看一下如何构建 CloseableHttpClientclose 方法的,核心代码如下,注意看其中我补充的注释

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 自动执行 clientclose 方法,这时关闭了共用的全局静态 ConnectionManager

当其他请求获取 CloseableHttpClient 对象并请求时,ConnectionManager 已经被关闭,遂报出 Connection pool shut down 异常

这一过程速度非常快,导致原来函数执行时间缩短很多。因为一次 http 请求 100ms - 数秒,而检测 ConnectionManager 关闭报错只要几 ms。这进而导致了单位时间内,所有函数的执行次数都飙升的很高。

相关文章:

CloseableHttpClient.close() 导致 Connection pool shut down 的问题

TL;DR; CloseableHttpClient.close() 方法默认行为是关闭 HttpClientConnectionManager如果多个 CloseableHttpClient 共用了同一个 HttpClientConnectionManager&#xff0c;则第一个请求执行完&#xff0c;其他请求就会爆 Connection pool shut down 异常备注&#xff1a;ht…...

centos7 docker空间不足

今天在使用docker安装镜像的时候&#xff0c;出现报错 查看原因&#xff0c;发现是分区空间不足导致的 所以考虑进行扩容 首先在vmware扩容并没有生效 因为只是扩展的虚拟空间&#xff0c;并不支持扩展分区大小&#xff0c;下面对分区进行扩容 参考&#xff1a; 分区扩容 主…...

C#基于SkiaSharp实现印章管理(5)

印章中最常见的特殊形状通常是五角星&#xff0c;空心、实心的都可能存在&#xff0c;本文学习并实现在印章内部绘制五角星形状。   百度五角星的绘制方法&#xff0c;主要分为三种&#xff1a;   1&#xff09;五角星各点坐标固定&#xff0c;直接调用编程语言的绘制线条或…...

【C#】ThreadPool的使用

1.Thread的使用 Thread的使用参考&#xff1a;【C#】Thread的使用 2.ThreadPool的使用 .NET Framework 和 .NET Core 提供了 System.Threading.ThreadPool 类来帮助开发者以一种高效的方式管理线程。ThreadPool 是一个线程池&#xff0c;它能够根据需要动态地分配和回收线程…...

【Python系列】Python 中`eval()`函数的正确使用及其风险分析

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

使用Spring Boot开发应用:基于请求参数MD5的缓存键及其他缓存方式

本文将介绍如何在Spring Boot应用中实现基于请求参数MD5的缓存键&#xff0c;以及其他常见的缓存方式。通过实际代码示例&#xff0c;展示如何应用这些技术优化系统性能。 1. 引入必要的依赖 首先&#xff0c;在Spring Boot项目中引入缓存相关的依赖。修改pom.xml文件&#x…...

typescript中interface常见3种用法

文章目录 函数类型对象类型【自命名】&#xff1a; (函数)对象类型 函数类型 作用&#xff1a;声明一个函数接口&#xff1a;可用于类型声明 | 不可implements 对象类型 作用&#xff1a;声明对象具备哪些实例接口&#xff1a;可用于类型 | 可implements 【自命名】&…...

windows10 安装CUDA教程

如何在windows10系统上安装CUDA? 1、查看电脑的NVIDIA版本 nvidia-smi 2、官网下载所需CUDA版本 官网地址:https://developer.nvidia.com/cuda-toolkit-archive 我们所安装的CUDA版本需要小于等于本机电脑的NVIDIA版本。推荐使用迅雷下载,速度会更快哦。 3、安装步骤...

计算机毕业设计选题推荐-某炼油厂盲板管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…...

PSO求解函数最小值的MATLAB例程|MATLAB源代码

本篇文章适合PSO入门&#xff0c;进阶的可能会觉得太简单的。 目录 PSO例程作用运行结果代码函数解释 例程修改tips PSO Particle Swarm Optimization&#xff0c;粒子群优化算法&#xff0c;通过模拟鸟群或鱼群的行为来寻找最优解。在计算时通过对一群粒子的位置和速度进行迭…...

scrapy 爬取旅游景点相关数据(一)

配套视频可以前往B站&#xff1a;麦麦大数据 项目目标: 爬取的是穷游旅游景点列表 、评论数据 &#x1f4ca; 章节&#xff1a; &#x1f606; Scrapy 爬取旅游景点相关数据&#xff08;一&#xff09; &#x1f606; Scrapy 爬取旅游景点相关数据&#xff08;二&#xff09; &…...

构建铁塔基站安全防护网:视频AI智能监控技术引领智慧化转型

一、背景现状 随着通信技术的快速发展&#xff0c;铁塔基站作为重要的通信基础设施&#xff0c;其安全、稳定、高效的运行对于保障通信网络的畅通至关重要。然而&#xff0c;铁塔基站大多分布在公路边、高山、野外等区域&#xff0c;巡检难度大&#xff0c;维护效率低&#xf…...

Java中的分布式缓存:Ehcache与Hazelcast

Java中的分布式缓存&#xff1a;Ehcache与Hazelcast 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨Java中的两种分布式缓存技术&#xff1a;Ehcache与Hazelcast。分布式缓存可以显…...

前端开发工程师的薪资,主要取决于哪3个方面?

作者&#xff1a;清水束竹 从2022年开始&#xff0c;互联网行业的就业情况就不容乐观了。 最明显的三个表现:裁员、缩招、降薪。 其实2021-2022年年中那段时间&#xff0c;互联网企业出现了一波假性繁荣。 某些大厂Q大量招聘应届毕业生&#xff0c;宣传铺天盖地&#xff0c;不…...

springboot美食网站—计算机毕业设计源码11574

摘 要 随着人们生活水平的提高&#xff0c;人们对美食的要求也越来越高&#xff0c;对各类美食信息需求越来越大。因此&#xff0c;结合计算机快速发展、普及&#xff0c;在此基础上制作一个页面简单、美观,功能实用的美食网站势在必行&#xff0c;满足用户分享美食的需求。 美…...

WordPress建站:如何使用ChemiCloud搭建外贸独立站

以前自行搭建一个网站&#xff0c;不懂一点技术那是很难完成的&#xff0c;现如今WordPress的出现极大地降低了搭建网站的技术门槛&#xff0c;不需要懂任何代码&#xff0c;只需按步骤操作就行。WordPress 是一个非常流行的开源内容管理系统&#xff08;CMS&#xff09;&#…...

在 Vim 编辑器中,如果某个单词被意外地高亮显示,使用:noh可以取消高亮显示

文章目录 1、问题出现的背景2、解决办法 1、问题出现的背景 配置镜像加速器&#xff0c;修改 /etc/docker/daemon.json 目录下的文件&#xff0c;不小心高亮显示https&#xff0c;产生问题的步骤是&#xff0c;我先是按esc键退出vim的编辑模式&#xff0c;然后在https的前面按…...

一条命令安装mysql,php

一条命令安装mysql&#xff0c;php&#xff0c;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文件夹&#xff0c;并在其中创建一个repository文件夹 三、桌面右键单击属性设置&#xff0c;搜索环境 添加MAVEN HOME变量&#xff0c;让然后把apache-maven路径下的bin文件的路径复制进来 用记事本或者NotePad打开下图路径的set…...

飞书打卡 快捷指令

使用快捷指令定时飞书打卡 在网上找了一圈&#xff0c;只有钉钉打卡的快捷指令&#xff0c;但是公司换飞书&#xff0c;哪个打工人不怕忘记打卡呢&#xff0c;所以自己研究了一下&#xff0c;其实也很简单。 找url 问题的最关键是打开飞书的打卡界面 如果只是打开飞书APP 很…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...