2

我使用Apache DefaultHttpClient,其中PoolingClientConnectionManagerBasicResponseHandler。这些在不同的线程之间共享,并且每个线程创建它自己的HttpRequestBase扩展。使用PoolingClientConnectionManager时释放连接?

我是否需要手动告诉我使用BasicResponseHandlers时使用方面所做的经理吗?我是否需要将它封装在finally中,这样异常不会导致连接泄漏?

换句话说,做我需要做的这

HttpGet get = new HttpGet(address); 
try { 
    httpclient.execute(get, new BasicResponseHandler()); 
} finally { 
    get.reset(); 
} 

或是否足够呢?

HttpGet get = new HttpGet(address); 
httpclient.execute(get, new BasicResponseHandler()); 

我没有看到Apache documentation.

回答

3

一个明确的答案这是足够的,建议。

HttpClient#execute方法保证自动释放与一个异常的情况下,该请求相关联的所有资源(或者I/O或运行时)。当使用ResponseHandler处理HTTP响应时,底层连接会自动释放回连接管理器。

+0

这是我的假设,但我希望看到更好的解释或链接到一些权威来源。 – Eyal

+0

@Eyal请参见注释以“响应处理” http://hc.apache.org/httpcomponents-client-ga/examples.html – oleg

+0

@oleg但是这个例子是单线程的,并且由于它们调用关机() finally子句,连接的释放是有保证的。在ResponseHandler的工作中,我担心会导致连接管理器认为连接仍在使用中,例如发生异常。 – Eyal