为什么我使用HttpClients.createDefault()作为HttpClient单例实例执行第三个请求总是挂起

时间:2013-11-12 02:56:37

标签: apache-httpclient-4.x hang

全部,

我创建:

public static final HttpClient DEFAULT_HTTPCLIENT = HttpClients
        .createDefault();

for(int i=0 ; i<5; i++){
    DEFAULT_HTTPCLIENT.execute(requests[i]);
}

但是当循环到i = 2时,这意味着只执行前两个请求,直到第三个请求,客户端将挂起并且似乎死循环。

我提到了一些材料,我得到的可能是Http Thread Pool配置有限。但我知道这个问题的标准解决方案是什么?由于我想随时发送任何请求,但我不希望每次都创建新的HttpClient。那么对于这个问题你有什么好的和标准的建议吗?

在我调试这个问题之后,我发现它在HttpClient下面是代码块: PoolingHttpClientConnectionManager - &gt; leaseConnection - &gt;     entry = future.get(timeout,tunit);

protected HttpClientConnection leaseConnection(
        final Future<CPoolEntry> future,
        final long timeout,
        final TimeUnit tunit) throws InterruptedException, ExecutionException,   ConnectionPoolTimeoutException {
    final CPoolEntry entry;
    try {
        entry = future.get(timeout, tunit);
        if (entry == null || future.isCancelled()) {
            throw new InterruptedException();
        }
        Asserts.check(entry.getConnection() != null, "Pool entry with no connection");
        if (this.log.isDebugEnabled()) {
            this.log.debug("Connection leased: " + format(entry) + formatStats(entry.getRoute()));
        }
        return CPoolProxy.newProxy(entry);
    } catch (final TimeoutException ex) {
        throw new ConnectionPoolTimeoutException("Timeout waiting for connection from pool");
    }
}

1 个答案:

答案 0 :(得分:6)

这是因为您的代码泄漏了连接。默认情况下,HttpClient配置为允许同一路由不超过两个并发连接,因此在池完全耗尽之前只需要执行两次请求。

http://hc.apache.org/httpcomponents-client-ga/tutorial/html/fundamentals.html#d5e145