线程池相关参数配置介绍

        最近几天在测境碰到一个问题,httpclient 在使用线程池时, 间隔性的出现 NoHttpResponseException 异常。

​​​​​​​httpclient org.apache.http.NoHttpResponseException: host:443 failed to respond

用了连接池很多年了, 一搜自己的博客, 竟然没做过一次整理和收藏, 其实大致原因也猜出个八九不离十, 秉承着严谨的态度😄, 还是百度了一下...大致总结出2个原因


1.当服务端由于负载过大等情况发生时,可能会导致在收到请求后无法处理(比如没有足够的线程资源),会直接丢弃链接而不进行处理。此时客户端就会报错:NoHttpResponseException。
解决建议: 重试

2.客户端与服务端建立的请求在服务端已经失效。(例如:服务端 springboot 内置 tomcat 默认 keepAliveTimeout :20s,客户端自定义 keepAliveTimeout :30s,客户端连接池中取出的空闲连接可能已经被服务端失效,再次从连接池拿该失效连接进行请求时,就会报错。)
解决建议:检查并关闭失效连接

问题依然解决, 解决过程中温习的知识还是需要记载下, 方便下次出现问题, 或者自己再次使用和有需要的小伙伴方便查找,

PoolingHttpClientConnectionManager pool = new PoolingHttpClientConnectionManager(socketFactoryRegistry);// pool max connectpool.setMaxTotal(maxTotal);// 设置最大路由pool.setDefaultMaxPerRoute(defaultMaxPerRoute);RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(connectionRequestTimeout).setSocketTimeout(socketTimeout).setConnectTimeout(connectTimeout).build();HttpClientUtil.closeableHttpClient = HttpClients.custom()// 设置连接池管理.setConnectionManager(pool)// 设置请求配置.setDefaultRequestConfig(requestConfig)//问题一解决方案:设置重试.setServiceUnavailableRetryStrategy(new DefaultServiceUnavailableRetryStrategy(3, 2000))//问题二解决方案:调整 keepAliveTimeout,这样无法复用长连接.setKeepAliveStrategy(new DefaultConnectionKeepAliveStrategy())//问题二解决方案:设置重试次数.setRetryHandler(new DefaultHttpRequestRetryHandler(3, false))//问题二解决方案:设置自动关闭过期链接.evictIdleConnections(30, TimeUnit.SECONDS).build();

对于问题二解决方案中evictIdleConnections方法的工作原理感兴趣的同学, 可以查看源码, 这里贴出部分代码, 供参考, 其实自己实现也一样

  • 初始化变量 HttpClientBuilder.evictIdleConnections()
public final HttpClientBuilder evictIdleConnections(final long maxIdleTime, final TimeUnit maxIdleTimeUnit) {this.evictIdleConnections = true;this.maxIdleTime = maxIdleTime;this.maxIdleTimeUnit = maxIdleTimeUnit;return this;}
  • 构建逻辑 HttpClientBuilder.build() 
if (evictExpiredConnections || evictIdleConnections) {final IdleConnectionEvictor connectionEvictor = new IdleConnectionEvictor(cm,maxIdleTime > 0 ? maxIdleTime : 10, maxIdleTimeUnit != null ? maxIdleTimeUnit : TimeUnit.SECONDS,maxIdleTime, maxIdleTimeUnit);closeablesCopy.add(new Closeable() {@Overridepublic void close() throws IOException {connectionEvictor.shutdown();try {connectionEvictor.awaitTermination(1L, TimeUnit.SECONDS);} catch (final InterruptedException interrupted) {Thread.currentThread().interrupt();}}});connectionEvictor.start();}
  •  初始化链接处理线程 IdleConnectionEvictor
 public IdleConnectionEvictor(final HttpClientConnectionManager connectionManager,final ThreadFactory threadFactory,final long sleepTime, final TimeUnit sleepTimeUnit,final long maxIdleTime, final TimeUnit maxIdleTimeUnit) {this.connectionManager = Args.notNull(connectionManager, "Connection manager");this.threadFactory = threadFactory != null ? threadFactory : new DefaultThreadFactory();this.sleepTimeMs = sleepTimeUnit != null ? sleepTimeUnit.toMillis(sleepTime) : sleepTime;this.maxIdleTimeMs = maxIdleTimeUnit != null ? maxIdleTimeUnit.toMillis(maxIdleTime) : maxIdleTime;this.thread = this.threadFactory.newThread(new Runnable() {@Overridepublic void run() {try {while (!Thread.currentThread().isInterrupted()) {Thread.sleep(sleepTimeMs);connectionManager.closeExpiredConnections();if (maxIdleTimeMs > 0) {connectionManager.closeIdleConnections(maxIdleTimeMs, TimeUnit.MILLISECONDS);}}} catch (final Exception ex) {exception = ex;}}});}

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

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

相关文章

面试宝典之JVM优化

J01、类加载的几个过程? 加载、验证、准备、解析、初始化。然后是使用和卸载了 J02、Minor GC 与 Full GC 分别在什么时候发生? 新生代内存不够用时候发生 MGC 也叫 YGC,JVM 内存不够的时候发生 FGC J03、java 中垃圾收集的方法有哪些? …

史诗级长文--朴素贝叶斯

引言 朴素贝叶斯算法是有监督的学习算法,解决的是分类问题,如客户是否流失、是否值得投资、信用等级评定等多分类问题。该算法的优点在于简单易懂、学习效率高、在某些领域的分类问题中能够与决策树、神经网络相媲美。但由于该算法以自变量之间的独立&am…

质量小议37 -- 架构

架构?架构师? 听的很多,也见过很多所谓的架构、架构师,其实多数都只是软件设计师。 那什么是架构、什么是架构师?估计很长时间自己仍不会完全理解、也不会完全明白。 但不影响再把一些基本概念拿出来再看一…

文字转语音在线合成系统源码 附带完整的安装部署教程

现如今,文字转语音(TTS)技术逐渐成为人们获取信息的重要手段之一。然而,市面上的TTS工具大多需要下载安装,且功能较为单一,无法满足用户多样化的需求。因此,开发一款功能强大、易于部署的文字转…

分治法-快速排序

基本思路 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 缺点&…

暄桐写字计划 | 开始布局我们的2024

暄桐是一间传统美学教育教室,创办于2011年,林曦是创办人和授课老师,教授以书法为主的传统文化和技艺,皆在以书法为起点,亲近中国传统之美,以实践和所得,滋养当下生活。      暄桐林曦老师有…

C++11 左右值引用、移动语义

右值引用和移动语义 什么是左值?什么是左值引用? 左值是一个表示数据的表达式(如变量名或解引用的指针),我们可以获取它的地址可以对它赋值,左值可以出现赋值符号的左边,右值不能出现在赋值符号左边。定义时const修饰…

智汇云舟副总裁陈虹旭受邀出席2024昆山工业元宇宙创新论坛

近日,由昆山市工业和信息化局、昆山经济技术开发区科技局指导,中国电子商会元宇宙专委会主办的2024昆山工业元宇宙创新论坛圆满举行。来自西北工业大学、中国电信股份有限公司昆山分公司、中国电信天翼云公司等单位的一百余位专家和企业领导齐聚一堂&…

【Golang】IEEE754标准二进制字符串转为浮点类型

IEEE754介绍 IEEE 754是一种标准,用于表示和执行浮点数运算的方法。在这个标准中,单精度浮点数使用32位二进制表示,分为三个部分:符号位、指数位和尾数位。 符号位(s)用一个位来表示数的正负,0表示正数,1表…

【信息安全】深度分析邮件安全及钓鱼攻击防范

本博文共计3100余字,预计需阅读20分钟 【邮件安全建设】 一、前言 邮件系统作为企业办公网络架构中重要的组成部分,同时也是业务高频使用的办公应用,一旦出现安全问题,业务将会被严重干扰甚至中断,本篇博客通过攻守两…

腾讯云的域名使用阿里云服务器配置

因为近期云服务器到期了,之前的域名已经完成了备案不想轻易回收。于是就换了个厂商,从腾讯云换到了阿里云。但是因为两个厂商不互通。我又不想把域名转入到阿里云。所以就开启了配置之路,一路磕磕绊绊。给大家整理一份顺序,一步到…

Qt6安装教程

由于QT在5.14版本后不再有离线安装版本,均需要通过在线安装 1.下载exe安装包 打开Open Source Development | Open Source License | Qt,往下拉,找到红框所示的按钮 点进去后点击Download即可 2 安装 下载完成后可得到qt-unified-windows…

vue3基础: 组件注册

组件注册 一个 Vue 组件在使用前需要先被“注册”,这样 Vue 才能在渲染模板时找到其对应的实现。组件注册有两种方式:全局注册和局部注册。 全局注册 我们可以使用 Vue 应用实例的.component()方法,让组件在当前 Vue 应用中全局可用。 im…

[情商-11]:人际交流的心理架构与需求层次模型

目录 前言: 一、心理架构 1.1 个体生理层 1.2 个体心理层 1.3 点对点人际交流层 1.4 社会网络层 1.5 社会价值层 二、人的需求层次模型 2.1 需求(欲望)层次模型 2.2 基因与人需求之间的关系 2.3 个体生理需求 2.4 个体的心理需求…

平衡小车——调试协议

学习目标 熟悉协议的定义掌握协议生成掌握协议解析熟悉消息队列处理协议熟悉消息队列处理业务学习内容 协议的定义 帧头 命令位 数据长度 数据位 校验位 帧尾 字节数 1 1 1 n 1 1 默认值 0x7a 待定 待定 待定 待定

部署Tomcat

Tomcat简介 名称由来:Tomcat最初是由 Sun的软件构架师詹姆斯邓肯戴维森开发的,后来他帮助将其变 为开源项目,并由Sun贡献给Apache软件基金会,由于大部分开源项目OReilly都会出一本相关的 书,并且将其封面设计成某个动物…

Pandas实战100例 | 案例 16: 字符串操作 - 分割和转换

案例 16: 字符串操作 - 分割和转换 知识点讲解 Pandas 提供了丰富的字符串操作功能,这些功能很大程度上类似于 Python 原生的字符串方法。你可以对 DataFrame 或 Series 中的字符串进行分割、转换、替换等操作。这些操作在处理文本数据时非常有用。 字符串分割: …

计算机毕业设计 基于Java的综合小区管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

力扣labuladong一刷day56天二叉堆实现优先级队列

力扣labuladong一刷day56天二叉堆实现优先级队列 一、二叉堆实现优先级队列 二叉堆就是大顶堆或者小顶堆,底层结构采用数组,从索引1开始,i2是左孩子,i21是右孩子,i/2是父节点。 二叉堆一般有三个操作: 获…

力扣207. 课程表

深度优先搜索 思路: 课程看作节点,依赖关系看作是有向边,整体是一个有向图;要学完所有课程,则需要有向图中不存在相互依赖,即不存在环;依次遍历课程,如果课程状态依赖未解决&#x…