首页 > 解决方案 > 什么是 HttpRequestBase#releaseConnection 用于 Apache httpclient-4.5.x

问题描述

正如我们从httpclient-4.5.x quick start中看到的那样,“为了确保系统资源的正确释放,用户必须从 finally 子句中调用 CloseableHttpResponse#close()。”

但是,让我们检查一下 HttpRequestBase#releaseConnection() 的代码。注释说“一种简化从 HttpClient 3.1 API 迁移的便捷方法。此方法等效于 {@link #reset()}。”

public abstract class HttpRequestBase extends AbstractExecutionAwareRequest
    implements HttpUriRequest, Configurable {
......
/**
     * A convenience method to simplify migration from HttpClient 3.1 API. This method is
     * equivalent to {@link #reset()}.
     *
     * @since 4.2
     */
    public void releaseConnection() {
        reset();
    }

....
}

我想问一下,既然我们只需要在 finally 子句中调用 CloseableHttpResponse#close() 来释放资源,那么 HttpRequestBase#releaseConnection() 是用来做什么的呢?AbstractExecutionAwareRequest#reset() 用于什么?我们什么时候应该使用 HttpRequestBase#releaseConnection() 或 AbstractExecutionAwareRequest#reset()。

标签: javahttpclient

解决方案


我已经跟踪了 HttpRequestBase#releaseConnection() 和 CloseableHttpResponse#close() 的来源,这两种方法都会调用 HttpClientConnectionManager#releaseConnection()。所以我认为它们都可以用来释放连接。但是既然官方文档推荐我们使用CloseableHttpResponse#close(),我们最好还是用CloseableHttpResponse#close()来释放连接。


推荐阅读