библиотека apache httpclient 4.5 правильное использование

 
 
 
Сообщения:1
Вариант использования 1:
class A{
CloseableHttpClient httpclient = HttpClients.createDefault();
void send(){
httpclient.execute(..)
}
void quit(){
httpclient.close();
}
}
Вариант использования 2:
class A{
void send(){
try(CloseableHttpClient httpclient = HttpClients.createDefault();){
client.execute(...)
}
}
}

Вариант1 - клиент создается при старте приложения , многократно вызывается в single-threadе, при завершении приложения закрывается. Вариант2- на каждый запрос создается клиент, после запроса закрывается. Вариант1 работает быстрее, но есть опасение, что ресурсы не освобождаются - потенциальная утечка.

В сообщетсве мнения разделяются:

Источники:
----------------------------------------------------------------------------------------------------------------
https://hc.apache.org/httpcomponents-client-4.5.x/tutorial/html/fundamentals.html#d5e217

1.2.2. HttpClient resource deallocation
When an instance CloseableHttpClient is no longer needed and is about to go out of scope the connection manager associated with it must be shut down by calling the CloseableHttpClient#close() method.
CloseableHttpClient httpclient = HttpClients.createDefault();
try {
<...>
} finally {
httpclient.close();
}
----------------------------------------------------------------------------------------------------------------
https://stackoverflow.com/questions/21574478/what-is-the-difference-between-closeablehttpclient-and-httpclient-in-apache-http

Doubt on the answer "HttpClient resource deallocation".

It is mentioned in old 3.x httpcomponents doc, which is long back and has a lot difference from 4.x HC. Besides the explanation is so brief that doesn't say what this underlying resource is.

I did some research on 4.5.2 release source code, found the implementations of CloseableHttpClient:close() basically only closes its connection manager.

(FYI) That's why when you use a shared PoolingClientConnectionManager and call client close(), exception java.lang.IllegalStateException: Connection pool shut down will occur. To avoid, setConnectionManagerShared works.

I prefer not do CloseableHttpClient:close() after every single request

I used to create a new http client instance when doing request and finally close it. In this case, it'd better not to call close(). Since, if connection manager doesn't have "shared" flag, it'll be shutdown, which is too expensive for a single request.

In fact, I also found in library clj-http, a Clojure wrapper over Apache HC 4.5, doesn't call close() at all. See func request in file core.clj
Изменен:04 авг 2017 15:00
 
 
Сообщения:61
Второй всё же четче, его сам Шилдт рекомендует!

Программирование начинается с себя
 
 
Сообщения:2419
HttpClient это тяжелый объект, из-за того что под ним сидит пул коннекшенов, поэтому его нужно максимально переиспользовать, и не в коем случае не создавать под каждый запрос.
 
 
Сообщения:2419
HACKERZET:
Второй всё же четче, его сам Шилдт рекомендует!

Не рекомендует.
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет