Я изучаю приложение, разработанное нашей компанией. Он использует библиотеку Apache HttpClient. В исходном коде он использует HttpClient
класс для создания экземпляров для подключения к серверу.
Я хочу узнать об Apache HttpClient, и я просмотрел этот набор примеров . Во всех примерах используется CloseableHttpClient
вместо HttpClient
. Так что я думаю, что CloseableHttpClient
это расширенная версия HttpClient
. Если это так, у меня есть два вопроса:
- В чем разница между этими двумя?
- Какой класс рекомендуется использовать для моей новой разработки?
java
apache
http
apache-httpclient-4.x
Наяна Адассурия
источник
источник
HttpClient
экземпляры? Если это важно, почемуclose()
метод не является частью базового интерфейса?Ответы:
Вот пример процесса выполнения запроса в простейшем виде:
Освобождение ресурса HttpClient: когда экземпляр CloseableHttpClient больше не нужен и собирается выйти за пределы области действия, связанный с ним диспетчер соединений должен быть отключен путем вызова метода CloseableHttpClient # close ().
см. Справочник, чтобы изучить основы.
@Scadge Начиная с Java 7, использование оператора try-with-resources гарантирует, что каждый ресурс будет закрыт в конце оператора. Может использоваться как для клиента, так и для каждого ответа
try(CloseableHttpClient httpclient = HttpClients.createDefault()){ // e.g. do this many times try (CloseableHttpResponse response = httpclient.execute(httpget)) { //do something } //do something else with httpclient here }
источник
httpget
такжеБыл такой же вопрос. Другие ответы, похоже, не объясняют, почему close () действительно необходим? Кроме того, Op, похоже, изо всех сил пытался выяснить предпочтительный способ работы с HttpClient и др.
Согласно 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.
Кроме того, отношения складываются следующим образом:
Предпочтительный способ согласно Apache:
Приведенный ими пример подходит и
httpclient.close()
для данногоfinally
предложения, и также используетсяResponseHandler
.В качестве альтернативы, способ, которым это делает mkyong, тоже немного интересен:
Он не показывает
client.close()
вызов, но я думаю, что это необходимо, такclient
как все еще является экземпляромCloseableHttpClient
.источник
Другие ответы, похоже, не объясняют, почему
close()
это действительно необходимо? * 2Сомневаюсь в ответе "Освобождение ресурса HttpClient".
Он упоминается в старом документе httpcomponents 3.x , который появился давно и сильно отличается от 4.x HC. К тому же объяснение настолько краткое, что не говорит, что это за основной ресурс.
Я провел небольшое исследование исходного кода выпуска 4.5.2, обнаружил, что реализация в
CloseableHttpClient:close()
основном закрывает только его диспетчер соединений.(FYI) Вот почему, когда вы используете общий
PoolingClientConnectionManager
и вызывающий клиентclose()
,java.lang.IllegalStateException: Connection pool shut down
произойдет исключение . Чтобы избежать,setConnectionManagerShared
работает.Я предпочитаю не делать
CloseableHttpClient:close()
после каждого запросаРаньше я создавал новый экземпляр http-клиента при выполнении запроса и, наконец, закрывал его. В этом случае лучше не звонить
close()
. Поскольку, если диспетчер соединений не имеет флага «общий», он будет отключен, что слишком дорого для одного запроса.Фактически, я также обнаружил в библиотеке clj-http , оболочку Clojure над Apache HC 4.5, которая вообще не вызывает
close()
. См. Funcrequest
в файле core.cljисточник
В следующей мажорной версии
HttpClient
интерфейс библиотеки будет расширятьсяCloseable
. До тех пор рекомендуется использовать,CloseableHttpClient
если совместимость с более ранними версиями 4.x (4.0, 4.1 и 4.2) не требуется.источник
HttpClient
это не класс, это интерфейс. Вы не можете использовать его для развития так, как хотите.Вам нужен класс, реализующий
HttpClient
интерфейс, и это такCloseableHttpClient
.источник
CloseableHttpClient
- это базовый класс библиотеки httpclient, который используют все реализации. Другие подклассы по большей части устарели.Это
HttpClient
интерфейс для этого класса и других классов.Затем вы должны использовать
CloseableHttpClient
в своем коде и создать его с помощьюHttpClientBuilder
. Если вам нужно обернуть клиента, чтобы добавить определенное поведение, вы должны использовать перехватчики запросов и ответов вместо обертывания сHttpClient
.Этот ответ был дан в контексте httpclient-4.3.
источник
Джон Скит сказал:
Документация мне кажется довольно ясной: «Базовая реализация HttpClient, которая также реализует Closeable» - HttpClient - это интерфейс; CloseableHttpClient - это абстрактный класс, но поскольку он реализует AutoCloseable, вы можете использовать его в операторе try-with-resources.
Но потом Жюль спросил:
@JonSkeet Это ясно, но насколько важно закрывать экземпляры HttpClient? Если это важно, почему метод close () не является частью базового интерфейса?
Ответ для Жюля
Чтобы приспособиться к заявлению "попробуйте с ресурсами". Обязательно реализовать Closeable. Следовательно, включил его в CloseableHttpClient .
Заметка:
Метод close в AbstractHttpClient, который расширяет CloseableHttpClient, устарел, мне не удалось найти для него исходный код.
источник