CloseableHttpResponse(Apache-httpclient-4.5.3から)を使用していますが、正しく使用しているかどうかわかりません。 投票なしの回答 で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();
}
現在、sendメソッド内でCloseableHttpClient
とCloseableHttpResponse
のリソースを使用してtryを使用しています。
開いているリソースを見逃したり、間違った方法で使用したりしていませんか?
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;
}
それはドキュメントで詳細に説明されています ここ 。
ドキュメントから擬似コードを引用すると、CloseableHttpClient
のインスタンスを割り当て/割り当て解除する一般的な方法は次のとおりです。
try (CloseableHttpClient httpclient = HttpClients.createDefault()) {
<...>
}
同じことがCloseableHttpResponse
にも当てはまります。
try (CloseableHttpResponse response = httpclient.execute(httpget)) {
<...>
}
さて、CloseableHttpClient
のcloseメソッドについて。 CloseableHttpClient
は、Closeable
インターフェースを実装する抽象クラスです。つまり、close
メソッド自体はありませんが、それを拡張するクラスはclose
メソッドを実装する必要があります。 1つのクラスはInternalHttpClient
です。詳細はソースコードで確認できます。
Java7より前は、明示的なクローズが必要でした。
CloseableHttpClient httpclient = HttpClients.createDefault();
try {
<...>
} finally {
httpclient.close();
}
CloseableHttpResponse response = httpclient.execute(httpget);
try {
<...>
} finally {
response.close();
}
Try(resource)を使用すると、最終的に回避できます。
try(CloseableHttpResponse response = httpclient.execute(httpGet)){...}