web-dev-qa-db-ja.com

CloseableHttpResponse / CloseableHttpClientを閉じる正しい方法

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メソッド内でCloseableHttpClientCloseableHttpResponseのリソースを使用して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;
        }
4
user7294900

それはドキュメントで詳細に説明されています ここ
ドキュメントから擬似コードを引用すると、CloseableHttpClientのインスタンスを割り当て/割り当て解除する一般的な方法は次のとおりです。

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

同じことがCloseableHttpResponseにも当てはまります。

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

さて、CloseableHttpClientのc​​loseメソッドについて。 CloseableHttpClientは、Closeableインターフェースを実装する抽象クラスです。つまり、closeメソッド自体はありませんが、それを拡張するクラスはcloseメソッドを実装する必要があります。 1つのクラスはInternalHttpClientです。詳細はソースコードで確認できます。

Java7より前は、明示的なクローズが必要でした。

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

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

Try(resource)を使用すると、最終的に回避できます。

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

3
dvallejo