Вот пример процесса выполнения запроса в его самой простой форме:
CloseableHttpClient httpclient = HttpClients.createDefault(); HttpGet httpget = new HttpGet("http://localhost/"); CloseableHttpResponse response = httpclient.execute(httpget); try { //do something } finally { response.close(); }
освобождение ресурса HttpClient: , Когда экземпляр CloseableHttpClient больше не необходим и собирается выйти из объема, менеджер соединений, связанный с ним, должен быть закрыт путем называния CloseableHttpClient#close () методом.
CloseableHttpClient httpclient = HttpClients.createDefault(); try { //do something } finally { httpclient.close(); }
посмотрите Ссылка для изучения основных принципов.
@Scadge Начиная с Java 7, Использования попытка с ресурсами оператор гарантирует, что каждый ресурс закрывается в конце оператора.
try(CloseableHttpClient httpclient = HttpClients.createDefault()){
//do something with httpclient here
}
Имел тот же вопрос. Другие ответы, кажется, не обращаются, почему близко () действительно необходимо? Кроме того, Op, казалось, изо всех сил пытался выяснить предпочтительный способ работать с HttpClient, и др.
<час>Согласно [1 119] Apache:
// 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.
, Кроме того, отношения идут следующим образом:
HttpClient
(интерфейс)реализованный:
<блок цитирования>
CloseableHttpClient
- ThreadSafe.блок цитирования>
DefaultHttpClient
- ThreadSafe, НО удержал от использования , используйтеHttpClientBuilder
вместо этого.
HttpClientBuilder
- НЕ ThreadSafe, НО создает ThreadSafeCloseableHttpClient
.
- Использование для создания ПОЛЬЗОВАТЕЛЬСКИЙ
CloseableHttpClient
.
HttpClients
- НЕ ThreadSafe, НО создает ThreadSafeCloseableHttpClient
.
- Использование для создания ЗНАЧЕНИЯ ПО УМОЛЧАНИЮ или МИНИМАЛЬНЫЙ
CloseableHttpClient
.
предпочтительный путь согласно Apache:
CloseableHttpClient httpclient = HttpClients.createDefault();
пример , который они дают, делает httpclient.close()
в finally
пункт и также использует ResponseHandler
также.
Как альтернатива, путь mkyong делает это немного интересно, также:
HttpClient client = HttpClientBuilder.create().build();
Он не показывает client.close()
вызов, но я думал бы, что это необходимо, с тех пор client
все еще экземпляр [1 118].
Другие ответы, кажется, не обращаются, почему close()
действительно необходимо? * 2
Это упоминается в старом 3.x документ httpcomponents , который долго вернулся и имеет большое различие от 4.x свеча Гефнера. Помимо объяснения так кратко, который не говорит, каков этот базовый ресурс.
я провел некоторое исследование на 4.5.2 исходных кодах выпуска, нашел реализации CloseableHttpClient:close()
в основном только завершения его менеджер соединений.
(к вашему сведению) Вот почему, когда Вы будете использовать общее PoolingClientConnectionManager
и звонить клиенту close()
, исключение java.lang.IllegalStateException: Connection pool shut down
произойдет. Избегать, setConnectionManagerShared
работы.
CloseableHttpClient:close()
после каждого запроса , я раньше создавал новый http клиентский экземпляр при выполнении запроса и наконец закрывал его. В этом случае это было бы лучше для не вызова close()
. С тех пор, если менеджер соединений не имеет "совместно использованного" флага, это будет завершение работы, которое является слишком дорогим для единственного запроса.
На самом деле, я также нашел в библиотеке , clj-http, обертка Clojure по Apache HC 4.5, не звонит close()
вообще. Посмотрите func request
в файле core.clj
CloseableHttpClient
базовый класс httpclient библиотеки, та все использование реализаций. Другие подклассы по большей части удерживаются от использования.
Эти HttpClient
интерфейс для этого класса и других классов.
необходимо затем использовать CloseableHttpClient
в коде и создать его с помощью HttpClientBuilder
. Если необходимо перенести клиент для добавления определенного поведения, необходимо использовать запрос и перехватчики ответа вместо того, чтобы перенестись с HttpClient
.
Этот ответ был дан в контексте httpclient-4.3.
В следующей основной версии библиотеки HttpClient
интерфейс собирается расшириться Closeable
. До тех пор рекомендуется использовать CloseableHttpClient
, если совместимость с ранее 4.x версии (4.0, 4.1 и 4.2) не требуется.
HttpClient
не класс, это - интерфейс. Вы не можете использовать его для разработки в способе, которым Вы имеете в виду.
то, Что Вы хотите, является классом, который реализует эти HttpClient
интерфейс, и это CloseableHttpClient
.