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。这进而导致了单位时间内,所有函数的执行次数都飙升的很高。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Magento2 常用命令以及技巧

1.Magento 命令行工具 Magento2 带有一个命令行工具&#xff0c;在windows下&#xff0c;用管理员权限打开MS-DOS命令提示符&#xff0c;然后cd到Magento根目录&#xff0c;运行下面命令&#xff0c;就可 以看到这个强大的命令行工具的命令清单&#xff1a; php bin/magentoU…

【C++】C++11中R字符串的作用

在 C11 中添加了定义原始字符串的字面量 1.定义和基本使用 定义方式为&#xff1a; R"xxx(原始字符串)xxx"其中 () 两边的字符串可以省略&#xff0c;R只会处理括号中的字符串。 原始字面量 R 可以直接表示字符串的实际含义&#xff0c;而不需要额外对字符串做转义…

半球房屋:高性价比的创新建筑选择—轻空间

在现代建筑领域&#xff0c;半球房屋因其独特的设计和高性价比受到广泛关注。这种建筑形式不仅在外观上引人注目&#xff0c;更在功能和经济效益上表现出色。以下将介绍半球房屋的主要优势&#xff0c;特别是其在成本和效益方面的突出表现。 降低建造成本&#xff0c;节约资源 …

资金管理平台 -SAP创建凭证测试程序及增强!

文章目录 主要程序创建程序程序 代码解析变量定义抬头和项目初始值表头赋值调用BAPI其他的子例程 核心内表增强部分LFACIF5D程序FI_DOCUMENT_CHECK完整程序 BADI增强 主要程序 创建程序 程序 &---------------------------------------------------------------------* *…

Matplotlib面积图绘制秘籍:让你的数据‘膨胀’起来,但不吹泡泡哦!

1. 引言 嘿&#xff0c;数据迷们&#xff01;想不想让你的数据‘活’起来&#xff0c;跳一曲色彩斑斓的面积舞&#xff1f;Matplotlib面积图&#xff0c;不只是数字的堆砌&#xff0c;它是故事的讲述者&#xff0c;让复杂数据变得一目了然&#xff0c;还带点小幽默。快来一探究…

鸿蒙应用框架开发【首选项】 本地数据与文件

首选项 简介 本示例使用ohos.data.preferences接口&#xff0c;展示了使用首选项持久化存储数据的功能。 效果预览 使用说明 1.点击顶部titleBar的右侧切换按钮&#xff0c;弹出主题菜单&#xff0c;选择任意主题则切换相应的主题界面&#xff1b; 2.退出应用再重新进入&a…

C++客户端Qt开发——界面优化(美化登录界面)

美化登录界面 在.ui中拖入一个QFream&#xff0c;顶层窗口的QWidget无法设置背景图片&#xff0c;套上一层QFrame将背景图片设置到QFrame上即可 用布局管理器管理元素&#xff1a;用户名LineEdit&#xff0c;密码LineEdit&#xff0c;记住密码ComboBox&#xff0c;登录Button…

Windows本地构建镜像推送远程仓库

下载 Docker Desktop https://smartidedl.blob.core.chinacloudapi.cn/docker/20210926/Docker-win.exe 使用本地docker构建镜像和推送至远程仓库&#xff08;harbor&#xff09; 1、开启docker的2375端口 2、配置远程仓库push镜像可以通过http harbor.soujer.com:5000ps&am…

【C语言】数据类型全解析:编程效率提升的秘诀

目录 C语言数据类型详解1. 基本数据类型1.1 整型示例代码输出结果 1.2 浮点型示例代码输出结果 1.3 字符型示例代码输出结果 2. 派生数据类型2.1 数组示例代码输出结果 2.2 指针示例代码输出结果 2.3 结构体示例代码输出结果 2.4 共用体示例代码输出结果 3. 类型限定符3.1 cons…

为什么Word中正文总会变成标题?

问题 选中文字之后点击正文&#xff0c;格式总是会自动变成标题&#xff0c;然后出现在目录中&#xff0c;改不掉。 方法 是因为段落样式的大纲级别设置了标题级别 选中识别成标题的正文&#xff0c;右键选择段落&#xff0c;把大纲级别设置成正文就好。

微信小程序云开发订单微信支付与小票和标签打印的完整高效流程

一个字“全”&#xff01;&#xff01;&#xff01; 前言一、流程设定1、如何开通云支付流程2、以订单下单为例的支付流程2.1 业务场景介绍2.2 业务场景流程图 二、代码与代码文件组成1、页面JS2、云函数payPre3、支付回调函数pay_cb3.1 准备条件3.2 必要认知3.3 pay_cb 完整函…

Llama 4训练已开启!Meta科学家最新采访,揭秘Llama 3.1是如何炼成的

Llama 3.1的诞生标志着人工智能领域的一个重要里程碑&#xff0c;它不仅是Meta在大型语言模型&#xff08;LLM&#xff09;研发上的一次重大突破&#xff0c;也代表了开源AI模型在技术进步和应用潜力上的新高度。以下是对Llama 3.1的炼成过程、观点阐述以及未来发展趋势的分析。…

莫斯科的社会生态环境之一瞥

题记 社会生态&#xff0c;它是指人类随着利用科技对环境的作用所呈现出的人和人的关系&#xff0c;人和人群的关系&#xff0c;人群和环境的关系 。而生态文明的理念&#xff0c;提倡的不止是尊重自然、顺应自然、保护自然&#xff0c;也包含注重规律的和谐性、可持续性、稳定…

如何使用CANoe自带的TCP/IP Stack验证TCP的零窗口探测机制

如果想利用CANoe自带的TCP/IP协议栈验证TCP的零窗口探测机制,就必须添加一个网络节点并配置独立的CANoe TCP/IP协议栈,作为验证对象。而与它进行TCP通信的对端也是一个网络节点,但不要配置TCP/IP协议栈,而是使用CAPL代码在底层组装TCP报文模拟TCP通信过程。这样可以尽量减少…

2024年最强网络安全学习路线,详细到直接上清华的教材!

关键词&#xff1a;网络安全入门、渗透测试学习、零基础学安全、网络安全学习路线 首先咱们聊聊&#xff0c;学习网络安全方向通常会有哪些问题前排提示&#xff1a;文末有CSDN官方认证Python入门资料包 &#xff01; 1、打基础时间太长 学基础花费很长时间&#xff0c;光语…

医院体检信息管理系统,C#体检系统源码,健康体检系统PEIS

体检服务全流程 检前 检前注意事项提醒-体检预约-套餐选择-体检签到-费用缴纳 检中 科室队列提醒-增项检中支付 检后 报告查询-体检百科-报告解读-问卷调查 体检管理系统模块介绍 一、登记管理模块 登记体检者基本信息&#xff0c;包括唯一的体检编号&#xff0c;姓名、…

【Golang 面试 - 基础题】每日 5 题(八)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…

Miniconda快速安装conda

关注B站可以观看更多实战教学视频&#xff1a;hallo128的个人空间 安装官方网址&#xff1a;https://docs.anaconda.com/miniconda/#quick-command-line-install 1. Miniconda for Windows curl https://repo.anaconda.com/miniconda/Miniconda3-latest-Windows-x86_64.exe -o …

【LeetCode】56. 区间合并

区间合并 题目描述&#xff1a; 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示例 1&#xff1a; …

捷径,这世上有没有捷径

Q&#xff1a;大师&#xff0c;这个世界上有没有捷径&#xff1f; A&#xff1a;有呀&#xff0c;有捷径呀 Q&#xff1a;大师&#xff0c;那我要怎么走&#xff1f; A&#xff1a;你错啦&#xff0c;不要想着走捷径&#xff0c;因为捷径不是用来走的&#xff0c;捷径是用来飞的…