Httpclient报Timeout waiting for connection from pool 异常

小小的小小snake 发布于 2018/05/17 17:30
阅读 987
收藏 0

下面这段代码在定时一分钟的任务里面执行:

public String remoteJsonUTF8(String url) {
        HttpGet get = null;
        CloseableHttpResponse response = null;
        String json = null;
        CloseableHttpClient client = null;
        HttpClientPool pool = null;
        HttpEntity entity = null;
        InputStream ins = null;
        try {
            pool = HttpClientPool.getPool();
            client = pool.pop();
            boolean flag = false;
            int index = 0;
            while (!flag) {
                get = new HttpGet(url);
                response = (CloseableHttpResponse) client.execute(get);
                entity = response.getEntity();
                if (null == response)
                    return "[]";
                int statuscode=response.getStatusLine().getStatusCode();
                if (statuscode >= 200&&statuscode<300) {
                    json = EntityUtils.toString(entity, "UTF-8").trim();
                    if (null == json || json.length() == 0)
                        ;
                    else
                        flag=true;
                }
                if (!flag&&statuscode!=500) {
                    logger.error("重新认证");
                    EntityUtils.consume(entity);
                    release(get);
                    HttpClientPool.getPool().auth(client);//重新认证获取JSON
                }
                if (index > 1) {
                    json = "[]";
                    break;
                }
                ++index;
            }
        } catch (Exception e) {
            release(get);
            logger.error(e.getMessage());
            json = "[]";
        } finally {
            try {
                release(get);
                EntityUtils.consumeQuietly(entity);
                HttpClientPool.getPool().push(client);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return json;
    }

    /**
     * 释放资源
     * @param get
     */
    private void release(HttpGet get) {
        if (null != get) {
            get.abort();
            get.releaseConnection();
        }

}

调用remoteJsonUTF8方法在网络缓慢条件下如果get请求报了超时异常,下一次定时任务执行时候再发送Get请求会报Timeout waiting for connection from pool 异常。httpclient是复用的放在一个队列里面,初始化httpclient连接池时会获取十几个httpclient登录初始化cookie,提高后面多线程环境下的调用效率,按照异常之后未正确释放资源的思路考虑未找到问题点在哪。大神们能帮忙解答一下吗?谢谢了

下面是HttpClient初始化部分代码:

private static HttpClientPool pool=new HttpClientPool();
    private Logger logger= LogManager.getLogger(HttpClientPool.class);
    private PoolingHttpClientConnectionManager connManager;
    private BlockingQueue<CloseableHttpClient> queue = new LinkedBlockingDeque<>();
    private HttpClientBuilder builder;
    private int maxTotalPool =200;
    private int maxConPerRoute = 100;
    private int socketTimeOut=10*1000;
    private int reqConnectTimeout=5*1000;
    private int reqConnectionRequestTimeout=5*1000;
    private int reqSocketTimeout=10*1000;
    private List<NameValuePair>nvps;
    private SimpleDateFormat format = new SimpleDateFormat("YYYY-MM-dd HH🇲🇲ss.SSS");
    private String url;
    private String classBaseInfo=HttpClientPool.class.getName();
    
    private HttpClientPool() {
        RequestConfig requestConfig = RequestConfig.custom().setCookieSpec(CookieSpecs.DEFAULT).setConnectTimeout(reqConnectTimeout)
                .setConnectionRequestTimeout(reqConnectionRequestTimeout).setSocketTimeout(reqSocketTimeout).build();
        connManager = new PoolingHttpClientConnectionManager();
        connManager.setMaxTotal(maxTotalPool);
        connManager.setDefaultMaxPerRoute(maxConPerRoute);
        SocketConfig socketConfig = SocketConfig.custom().setSoTimeout(socketTimeOut).build();
        builder=HttpClients.custom().setDefaultSocketConfig(socketConfig).setDefaultRequestConfig(requestConfig).setConnectionManager(connManager);
        Thread clearThread=new HttpClientConnectionMonitorThread(connManager);
        //clearThread.run();
    }
     /**

 

加载中
返回顶部
顶部