Java HttpUtil 出现错误:org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool
最近项目中大量调用http请求,线上出现了ConnectionPoolTimeoutException 这个问题,但是本地服务器一直没能复现出来,但是定位问题应该是之前调用http的工具类封装的有问题,连接池设置的不对,但是一看目前项目中设置的数据和网上的大相径庭,以下是部分设置:
clientConnectionManager.setMaxTotal(300);
clientConnectionManager.setDefaultMaxPerRoute(30);
clientConnectionManager.setValidateAfterInactivity(1000);
private static final RequestConfig defaultRequestConfig = RequestConfig.custom()
.setSocketTimeout(3000)
.setConnectTimeout(3000)
.setConnectionRequestTimeout(3000)
.build();
在网上找了一些资料后,发现应该是调用接口这里处理的有问题
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
// 请求成功状态
String resultMsg = String.join("", IOUtils.readLines(response.getEntity().getContent(), StandardCharsets.UTF_8));
logger.info("httpClient 请求返回结果: {}", resultMsg);
return resultMsg;
}
这里的原因就是如果状态码返回了非200,即使用了连接池,也不会释放连接。本地用工具调用一个返回404的地址,果然在超过30个请求后,开始报错了,然后连接池阻塞卡死了。问了现场之后发现现场也是有个接口访问不到,一直返回404,定位到问题了,剩下的就是改写代码让出现异常的时候仍然释放连接。
参考了以下的博客进行解决:文章来源:https://www.toymoban.com/news/detail-539104.html
HttpClient大并发下Timeout waiting for connection from pool 问题解决方案_独行-浪子的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-539104.html
到了这里,关于org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!