欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 名人名企 > Timeout waiting for connection from pool 问题排查

Timeout waiting for connection from pool 问题排查

2024/10/25 1:35:36 来源:https://blog.csdn.net/qq_38374397/article/details/139632844  浏览:    关键词:Timeout waiting for connection from pool 问题排查

1. 报错解释

org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection 这个异常通常表示在尝试从HTTP连接池获取连接时发生了超时。这可能是因为连接池中没有可用的连接,或者所有的连接都在忙,并且在指定的时间内没有被释放。

2. 场景分析

之前的服务运行了很长时间都很稳定,然后昨天突然出现大量这个报错,后来得知是因为一个三方服务出现了问题,在三方服务故障期间通过HttpClient访问接口返回了非200请求,即使用了连接池,也并不会释放连接,导致连接池阻塞卡死了。所以就出现新的请求从连接池中获取httpClient的时候出现了超时。

3. 解决方案

HttpClient 版本

		<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.3.4</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpcore</artifactId><version>4.3.2</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpmime</artifactId><version>4.3.1</version></dependency>

连接池代码

package com.**.weixin.common.https;import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;public class HttpClientFactory {private static final Integer MAX_TOTAL = 300;             //连接池最大连接数private static final Integer MAX_PER_ROUTE = 50;          //单个路由默认最大连接数private static final Integer REQ_TIMEOUT =  5 * 1000;     //请求超时时间msprivate static final Integer CONN_TIMEOUT = 5 * 1000;     //连接超时时间msprivate static final Integer SOCK_TIMEOUT = 10 * 1000;    //读取超时时间msprivate static HttpClientConnectionMonitorThread thread;  //HTTP链接管理器线程public static HttpClientConnectionMonitorThread getThread() {return thread;}public static void setThread(HttpClientConnectionMonitorThread thread) {HttpClientFactory.thread = thread;}public static HttpClient createSimpleHttpClient(){SSLConnectionSocketFactory sf = SSLConnectionSocketFactory.getSocketFactory();return HttpClientBuilder.create().setSSLSocketFactory(sf).build();}public static HttpClient createHttpClient() {PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager();poolingHttpClientConnectionManager.setMaxTotal(MAX_TOTAL);poolingHttpClientConnectionManager.setDefaultMaxPerRoute(MAX_PER_ROUTE);RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(REQ_TIMEOUT).setConnectTimeout(CONN_TIMEOUT).setSocketTimeout(SOCK_TIMEOUT).build();HttpClientFactory.thread=new HttpClientConnectionMonitorThread(poolingHttpClientConnectionManager); //管理 http连接池return HttpClients.custom().setConnectionManager(poolingHttpClientConnectionManager).setDefaultRequestConfig(requestConfig).build();}
}

以下 线程用来清理 连接池无效的链接

package com.**.weixin.common.https;import java.util.concurrent.TimeUnit;import org.apache.http.conn.HttpClientConnectionManager;/*** <p>Description: 使用管理器,管理HTTP连接池 无效链接定期清理功能</p> * @author andy 2017年8月28日*/
public class HttpClientConnectionMonitorThread extends Thread {private final HttpClientConnectionManager connManager;private volatile boolean shutdown;public HttpClientConnectionMonitorThread(HttpClientConnectionManager connManager) {super();this.setName("http-connection-monitor");this.setDaemon(true);this.connManager = connManager;this.start();}@Overridepublic void run() {try {while (!shutdown) {synchronized (this) {wait(5000); // 等待5秒// 关闭过期的链接connManager.closeExpiredConnections();// 选择关闭 空闲30秒的链接connManager.closeIdleConnections(30, TimeUnit.SECONDS);}}} catch (InterruptedException ex) {}}/*** 方法描述: 停止 管理器 清理无效链接  (该方法当前暂时关闭) * @author andy 2017年8月28日 下午1:45:18*/@Deprecatedpublic void shutDownMonitor() {synchronized (this) {shutdown = true;notifyAll();}}}

参考文章:https://blog.csdn.net/duxing_langzi/article/details/77772673

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com