正确的关闭方式 CloseableHttpResponse/CloseableHttpClient

Right way to close CloseableHttpResponse/CloseableHttpClient

我正在使用 CloseableHttpResponse(来自 apache-httpclient-4.5.3)但我不确定我是否正确使用它,我最后看到 answer with no votes 使用 EntityUtils.consume :

CloseableHttpResponse response1 = httpclient.execute(httpGet);

try {

 System.out.println(response1.getStatusLine());

} finally {

 EntityUtils.consume(response1.getEntity());

CloseableHttpClient 是抽象的,没有可调用的 close 方法,尽管在此 answer 中使用了它:

CloseableHttpResponse response = httpclient.execute(httpget);
try {
    //do something
} finally {
    response.close();
}

目前我在发送方法中尝试使用 CloseableHttpClientCloseableHttpResponse 的资源。

我没有遗漏任何打开的资源或以错误的方式使用它吗?

private CloseableHttpResponse send()
            throws URISyntaxException, UnsupportedEncodingException, IOException, ClientProtocolException {
        URIBuilder uriBuilder = new URIBuilder(BASE_URL);
        HttpHost target = new HttpHost(uriBuilder.getHost(), uriBuilder.getPort(), uriBuilder.getScheme());
        HttpPost post = new HttpPost(uriBuilder.build());
        try (CloseableHttpClient httpClient = HttpClients.custom().build(); CloseableHttpResponse response = httpClient.execute(target, post)) {            
            return response;
        }
    

文档中有详细说明here
引用文档中的伪代码是 allocate/deallocate CloseableHttpClient 实例的典型方法:

try (CloseableHttpClient httpclient = HttpClients.createDefault()) {
    <...>
}

同样适用于CloseableHttpResponse:

try (CloseableHttpResponse response = httpclient.execute(httpget)) {
    <...>
}

现在,关于CloseableHttpClient中的关闭方法。 CloseableHttpClient 是实现 Closeable 接口的抽象 class。也就是说,虽然它本身没有 close 方法,但需要扩展它的 classes 来实现 close 方法。一个 class 是 InternalHttpClient。具体可以查看源码

在 Java7 之前,需要显式关闭:

CloseableHttpClient httpclient = HttpClients.createDefault();
try {
    <...>
} finally {
    httpclient.close();
}

CloseableHttpResponse response = httpclient.execute(httpget);
try {
    <...>
} finally {
    response.close();
}

你可以通过使用 try(resource)

来避免 finally

try (CloseableHttpResponse response = httpclient.execute(httpGet)) { ... }