最近系统在调用第三方系统时,出现一次严重的报错。导致系统半小时内出错率 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
```
相关推荐
httpclient常用封装工具 doGet(String url, Map, String> param) doPost(String url, Map, String> param) doPostJson(String url, String json)
模拟登录 不提供用户名密码
java httpclient 所需要的包,都是最新版的 commons-logging-1.1.3.jar commons-codec-1.6.jar commons-httpclient-3.1.jar
用java实现httpclient请求的类
java HttpClient 发送GET请求和带有表单参数的POST请求教程例子
JavaHttpClient实例
commons-beanutils-1.8.0.jar commons-codec.jar commons-collections-3.2.jar 等12个jar包
Eclipse下完整的java程序,包含HttpClient的全部jar包。通过java类文件,实现通过链接将文件下载本地
Java Httpclient的一个小例子,只有客户端的代码,服务器端随便写一个servlet都行,我也是新学的,主要是自己下载的jar包然后自己整合的
java_HttpClient学习,和解析htmljava_HttpClient学习,和解析html java_HttpClient学习,和解析htmljava_HttpClient学习,和解析html java_HttpClient学习,和解析htmljava_HttpClient学习,和解析html java_...
java httpclient 抓取 数据 和jar 包
JAVA利用HttpClient进行HTTPS接口调用
NULL 博文链接:https://piranha.iteye.com/blog/2119924
java httpclient 第三方包
Java中Httpclient需要的jar包(httpclient.jar,httpcore.jar及commons-logging.jar)
java的电商开发工具类,其中有HttpClient爬虫式工具类,基于Http以及Https都可以进行操作.
HttpClient.java
(完整版)JAVA利用HttpClient进行POST请求(HTTPS).doc
JAVA调用HTTP及httpclient的详细说明,包括HttpClient Post/GetMethod 转码方案汇总,使用httpclient实现http接口调用实例,含具体代码
java httpclient工具类好用