正确的关闭方式 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();
}
目前我在发送方法中尝试使用 CloseableHttpClient
和 CloseableHttpResponse
的资源。
我没有遗漏任何打开的资源或以错误的方式使用它吗?
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)) {
... }
我正在使用 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();
}
目前我在发送方法中尝试使用 CloseableHttpClient
和 CloseableHttpResponse
的资源。
我没有遗漏任何打开的资源或以错误的方式使用它吗?
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)
来避免 finallytry (CloseableHttpResponse response = httpclient.execute(httpGet)) { ... }