最近系统在调用第三方系统时,出现一次严重的报错。导致系统半小时内出错率 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库是Apache提供的一款强大的HTTP客户端工具,用于执行HTTP请求,包括GET、POST、PUT等多种HTTP方法。在"java httpclient 模拟登录"这个场景下,我们通常会用到HttpClient来模拟用户登录网站...
httpclient常用封装工具 doGet(String url, Map, String> param) doPost(String url, Map, String> param) doPostJson(String url, String json)
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来实现这一目标。 首先,我们需要导入必要的Apache HttpClient库,通常包含以下依赖: ```xml <groupId>org.apache.httpcomponents <artifactId>httpclient ...
- 如果文件较大,考虑使用`StreamingEntity`或分块读写,以避免一次性加载整个响应内容导致内存溢出。 6. **DownloadData文件**: 压缩包中的`DownloadData`可能是示例代码的源文件,包含了实现上述功能的具体...
在Java编程中,HttpClient是一个非常重要的库,常用于执行HTTP请求。当涉及到HTTPS接口调用时,HttpClient可以处理加密通信,确保数据传输的安全性。在这个主题中,我们将深入探讨如何在Java中使用HttpClient来实现...
java httpclient 所需要的包,都是最新版的 commons-logging-1.1.3.jar commons-codec-1.6.jar commons-httpclient-3.1.jar
### Java HttpClient 发送GET请求和带有表单参数的POST请求详解 #### 一、概述 在Java编程中,处理HTTP请求是一项常见的需求,特别是在与Web服务进行交互时。Apache HttpClient库提供了一种强大的方法来执行HTTP...
Java HttpClient 是 Apache HttpClient 库的一部分,它提供了丰富的功能,包括连接管理、重试策略、超时设置等,使得在Java中进行网络通信变得更加便捷。HttpClient库不仅支持基本的HTTP协议,还支持HTTPS以及一些...
用java实现httpclient请求的类
Java HttpClient 是一个强大的网络通信库,它允许Java开发者在应用程序中实现HTTP和HTTPS协议的请求。这个工具类在电商开发中特别有用,因为通常需要与各种Web服务进行交互,如商品信息抓取、订单同步、用户反馈处理...
在使用HttpClient发送POST请求时,我们需要关心两个方面的问题:一是如何忽略证书验证过程,二是如何发送POST请求。对于前者,我们可以使用X509TrustManager来忽略证书验证过程。对于后者,我们可以使用HttpPost对象...
在Java编程中,Apache HttpClient库是一个非常重要的工具,它提供了丰富的功能来执行HTTP请求,包括GET、POST等方法。这个库使得开发者能够方便地与Web服务器进行交互,处理各种HTTP协议相关的任务。在标题和描述中...
本实例将深入探讨如何在Java中使用HttpClient进行网络通信。 首先,你需要在项目中引入HttpClient的相关依赖。如果是Maven项目,可以在pom.xml文件中添加以下依赖: ```xml <groupId>org.apache.httpcomponents ...
在本实例中,我们将讲解如何使用HttpClient来传输XML字符串。首先,我们需要确保引入了正确的依赖,包括Apache HttpClient、HttpMime、Commons Lang以及其他的辅助库。以下是POM文件中的依赖配置: ```xml <!-- ....
这个样例项目旨在帮助初学者理解如何在Java中使用HttpClient来与Web服务器进行交互。 在JavaHttpProject这个项目中,你可以找到以下关键知识点: 1. **HttpClient的创建**:首先,你需要创建一个HttpClient实例。...
java_HttpClient学习,和解析htmljava_HttpClient学习,和解析html java_HttpClient学习,和解析htmljava_HttpClient学习,和解析html java_HttpClient学习,和解析htmljava_HttpClient学习,和解析html java_...
Java HttpClient是Apache软件基金会的Apache HTTP Components项目中的一个核心组件,它提供了一个强大的、高度可定制的客户端HTTP通信API。这个工具广泛应用于Java开发者中,用于执行HTTP请求,获取响应,处理各种...
在描述中提到了一个博客链接,虽然内容没有给出,但我们可以推测博主可能分享了一个使用Java HttpClient 3.1进行HTTP功能监控的实例。通常,这样的监控可能包括发送GET或POST请求到目标服务器,检查返回的状态码是否...