Почему Apache CloseableHttpResponse не использует сущность при закрытии?

Глядя на краткое руководство, оно дает следующий пример кода:

CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet("http://targethost/homepage");
CloseableHttpResponse response1 = httpclient.execute(httpGet);
// The underlying HTTP connection is still held by the response object
// to allow the response content to be streamed directly from the network socket.
// In order to ensure correct deallocation of system resources
// the user MUST call CloseableHttpResponse#close() from a finally clause.
// Please note that if response content is not fully consumed the underlying
// connection cannot be safely re-used and will be shut down and discarded
// by the connection manager. 
try {
    System.out.println(response1.getStatusLine());
    HttpEntity entity1 = response1.getEntity();
    // do something useful with the response body
    // and ensure it is fully consumed
    EntityUtils.consume(entity1);
} finally {
    response1.close();
}

Два комментария в приведенном выше коде говорят, что мы должны закрыть объект ответа для

"правильное освобождение системных ресурсов"

а также

"если содержимое ответа не используется полностью, базовое соединение не может быть безопасно использовано повторно и будет отключено и удалено диспетчером соединений".

Теперь Apache очень любезно реализует для нас CloseableHttpResponse, что означает, что мы можем использовать блок try-with-resources. Но метод close только закрывает объект ответа, почему он также не использует объект?

1 ответ

Поскольку в этот момент трудно сказать, намеревается ли вызывающий абонент повторно использовать базовое соединение. В некоторых случаях может потребоваться прочитать небольшой фрагмент из большого тела ответа и немедленно разорвать соединение.

Другими словами, одно и то же происходит снова и снова: нет единого способа сделать всех счастливыми.

Фрагмент кода обеспечит правильное перераспределение ресурсов при попытке сохранить работоспособность основного соединения.

CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet("http://targethost/homepage");
CloseableHttpResponse response1 = httpclient.execute(httpGet);
try {
    System.out.println(response1.getStatusLine());
} finally {
    EntityUtils.consume(response1.getEntity());
} 
Другие вопросы по тегам