This question already has answers here:
What is the difference between CloseableHttpClient and HttpClient in Apache HttpClient API?

(7个答案)


去年关闭。




我正在使用CloseableHttpResponse(来自apache-httpclient-4.5.3),我不确定我使用的是否正确,我最终看到answer with no votes可以使用EntityUtils.consume:
CloseableHttpClient是抽象的,没有可调用的close方法,尽管在此answer中使用了它:
CloseableHttpResponse response = httpclient.execute(httpget);
try {
    //do something
} finally {
    response.close();
}
目前,我正在尝试使用send方法中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;
        }

最佳答案

docs here中对此进行了详细说明。
从文档引用伪代码,这是分配/取消分配CloseableHttpClient实例的典型方法:

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

这同样适用于CloseableHttpResponse:
try (CloseableHttpResponse response = httpclient.execute(httpget)) {
    <...>
}

现在,关于CloseableHttpClient中的close方法。 CloseableHttpClient是实现Closeable接口(interface)的抽象类。也就是说,尽管它本身没有close方法,但是扩展它的类是实现close方法所必需的。一类是InternalHttpClient。您可以查看源代码以获取详细信息。

在Java7之前,需要显式关闭:
CloseableHttpClient httpclient = HttpClients.createDefault();
try {
    <...>
} finally {
    httpclient.close();
}

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

关于java - 关闭CloseableHttpResponse/CloseableHttpClient的正确方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48928930/

10-08 22:23