`
yangguoyk
  • 浏览: 7216 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

java httpClient 在默认配置下线程池堆满导致的一次大坑

    博客分类:
  • JAVA
阅读更多

最近系统在调用第三方系统时,出现一次严重的报错。导致系统半小时内出错率 timeout 奇高。

 

## 背景

项目使用 ClonableHttpClient 调用第三方 httpClient v4.5.3,使用时只调用了 connectTimeout, SocketTimeout. 第三方系统因故障导致服务器响应慢,期间出现较多的 ReadTimeout, 持续8分钟,随后恢复,而我们的系统当时正好处于业务高峰期,前端出现大量的 ReadTimeout, 持续了近40分钟。客户要求查原因

 

##  分析过程

- 系统上线运行了两年了,没有出现大的问题,这种场景的之前也遇到过,重启了事。

- 此次要求查 ROOT CAUSE。主要还是怀疑 httpClient 设置上。系统使用的代码如下

```

    CloseableHttpClient httpClient = context.getBean(CloseableHttpClient.class);
RequestConfig.Builder builder = RequestConfig.custom();
    builder.setAuthenticationEnabled(true);
    builder.setConnectTimeout(timeout);
    builder.setSocketTimeout(timeout);
    StringEntity stringEntity = new StringEntity(params, Charset.forName("UTF-8"));
HttpPost post = new HttpPost(address);
    post.setConfig(builder.build());
    post.setHeader("Content-type", "application/json; charset=utf-8");
    post.setEntity(stringEntity);
    HttpEntity httpEntity = httpClient.execute(post).getEntity();

```

 

基本是缺省配置,想来想去,最后认为应该是在第三方系统故障期间,堆积了大量的请求,进行了排队,即使第三方系统恢复了,入队的请求还要一个个的去消费。

参考 https://gaozzsoft.iteye.com/blog/2352241 

httpClient 默认会有一个线程池,默认的并发线程池为5,另中有一配置 setConnectionRequestTimeout 在无配置的情况下,排队的请求 会无限等待。 setConnectionRequestTimeout 可以设置一个等待可用线程池的最大等待时间。我们自行用代码验证这一逻辑,没有看到官方的描述。

 

设置之后,如果超时,会返回一个错误

```

org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool

```

 

分享到:
评论

相关推荐

    java httpclient 模拟登录

    在Java编程中,HttpClient库是Apache提供的一款强大的HTTP客户端工具,用于执行HTTP请求,包括GET、POST、PUT等多种HTTP方法。在"java httpclient 模拟登录"这个场景下,我们通常会用到HttpClient来模拟用户登录网站...

    JAVA httpclient jar下载

    httpclient常用封装工具 doGet(String url, Map, String> param) doPost(String url, Map, String> param) doPostJson(String url, String json)

    Java HttpClient 全部的jar包

    Java HttpClient 是一个强大的HTTP客户端库,它允许Java开发者在应用程序中发送HTTP请求并接收响应,广泛应用于Web服务的调用、API接口测试以及自动化脚本等场景。在Java项目中,使用HttpClient可以实现与Web服务器...

    java httpClient 工具类 java httpClient 工具类

    java httpClient 工具类 java httpClient 工具类 java httpClient 工具类 java httpClient 工具类 java httpClient 工具类 java httpClient 工具类 java httpClient 工具类 java httpClient 工具类 java httpClient ...

    Java 使用HttpClient保持SESSION状态

    下面我们将详细探讨如何在Java中使用HttpClient来实现这一目标。 首先,我们需要导入必要的Apache HttpClient库,通常包含以下依赖: ```xml <groupId>org.apache.httpcomponents <artifactId>httpclient ...

    java使用HttpClient通过url下载文件到本地

    - 如果文件较大,考虑使用`StreamingEntity`或分块读写,以避免一次性加载整个响应内容导致内存溢出。 6. **DownloadData文件**: 压缩包中的`DownloadData`可能是示例代码的源文件,包含了实现上述功能的具体...

    JAVA利用HttpClient进行HTTPS接口调用

    在Java编程中,HttpClient是一个非常重要的库,常用于执行HTTP请求。当涉及到HTTPS接口调用时,HttpClient可以处理加密通信,确保数据传输的安全性。在这个主题中,我们将深入探讨如何在Java中使用HttpClient来实现...

    java httpclient jar工具包

    java httpclient 所需要的包,都是最新版的 commons-logging-1.1.3.jar commons-codec-1.6.jar commons-httpclient-3.1.jar

    java HttpClient 发送GET请求和带有表单参数的POST请求教程例子

    ### Java HttpClient 发送GET请求和带有表单参数的POST请求详解 #### 一、概述 在Java编程中,处理HTTP请求是一项常见的需求,特别是在与Web服务进行交互时。Apache HttpClient库提供了一种强大的方法来执行HTTP...

    java httpclient 抓取 数据 和jar 包

    Java HttpClient 是 Apache HttpClient 库的一部分,它提供了丰富的功能,包括连接管理、重试策略、超时设置等,使得在Java中进行网络通信变得更加便捷。HttpClient库不仅支持基本的HTTP协议,还支持HTTPS以及一些...

    java httpclient

    用java实现httpclient请求的类

    JavaHttpClient

    Java HttpClient 是一个强大的网络通信库,它允许Java开发者在应用程序中实现HTTP和HTTPS协议的请求。这个工具类在电商开发中特别有用,因为通常需要与各种Web服务进行交互,如商品信息抓取、订单同步、用户反馈处理...

    (完整版)JAVA利用HttpClient进行POST请求(HTTPS).doc

    在使用HttpClient发送POST请求时,我们需要关心两个方面的问题:一是如何忽略证书验证过程,二是如何发送POST请求。对于前者,我们可以使用X509TrustManager来忽略证书验证过程。对于后者,我们可以使用HttpPost对象...

    Java中Httpclient需要的jar包(httpclient.jar,httpcore.jar及commons-logging.jar)

    在Java编程中,Apache HttpClient库是一个非常重要的工具,它提供了丰富的功能来执行HTTP请求,包括GET、POST等方法。这个库使得开发者能够方便地与Web服务器进行交互,处理各种HTTP协议相关的任务。在标题和描述中...

    JavaHttpClient实例

    本实例将深入探讨如何在Java中使用HttpClient进行网络通信。 首先,你需要在项目中引入HttpClient的相关依赖。如果是Maven项目,可以在pom.xml文件中添加以下依赖: ```xml <groupId>org.apache.httpcomponents ...

    java 中HttpClient传输xml字符串实例详解

    在本实例中,我们将讲解如何使用HttpClient来传输XML字符串。首先,我们需要确保引入了正确的依赖,包括Apache HttpClient、HttpMime、Commons Lang以及其他的辅助库。以下是POM文件中的依赖配置: ```xml <!-- ....

    java实现httpClient样例

    这个样例项目旨在帮助初学者理解如何在Java中使用HttpClient来与Web服务器进行交互。 在JavaHttpProject这个项目中,你可以找到以下关键知识点: 1. **HttpClient的创建**:首先,你需要创建一个HttpClient实例。...

    java-HttpClient学习,和解析html.zip

    java_HttpClient学习,和解析htmljava_HttpClient学习,和解析html java_HttpClient学习,和解析htmljava_HttpClient学习,和解析html java_HttpClient学习,和解析htmljava_HttpClient学习,和解析html java_...

    Java-HttpClient帮助文档

    Java HttpClient是Apache软件基金会的Apache HTTP Components项目中的一个核心组件,它提供了一个强大的、高度可定制的客户端HTTP通信API。这个工具广泛应用于Java开发者中,用于执行HTTP请求,获取响应,处理各种...

    简单的HTTP功能监控功能(java httpclient-3.1)

    在描述中提到了一个博客链接,虽然内容没有给出,但我们可以推测博主可能分享了一个使用Java HttpClient 3.1进行HTTP功能监控的实例。通常,这样的监控可能包括发送GET或POST请求到目标服务器,检查返回的状态码是否...

Global site tag (gtag.js) - Google Analytics