Почему 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());
}