Я пытаюсь понять, как лучше всего использовать apaches HTTPPooledConnectionManager и Closeable HTTPClient.Кажется, что все примеры, которые я видел, создают новый HTTPClient в запросе и не закрывают HttpClient.
Разве это должно быть статическим или для класса?Если HttpClient с диспетчером подключений в пуле можно использовать повторно и соединения возвращаются обратно в пул, разве мы не создаем HttpClient каждый раз, когда делаем запрос?Я хотел бы особенно понять это в основанном на пружине фреймворке.
Вот пример кода, где я думаю, что HttpClient должен быть статическим.
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import java.io.IOException;
import java.net.URISyntaxException;
public class Stub2000 {
private CloseableHttpClient httpClient;
public void init() {
RequestConfig config = RequestConfig.custom()
.setConnectTimeout(10000)
.setSocketTimeout(10000)
.setConnectionRequestTimeout(10000)
.build();
PoolingHttpClientConnectionManager poolManager = new PoolingHttpClientConnectionManager();
poolManager.setMaxTotal(10);
poolManager.setDefaultMaxPerRoute(10);
httpClient = HttpClients
.custom()
.setDefaultRequestConfig(config)
.setConnectionManager(poolManager)
.build();
}
public void getInfo() throws URISyntaxException, IOException {
final URIBuilder ruribuilder = new URIBuilder();
final HttpGet get = new HttpGet();
ruribuilder.setHost(host)
.setScheme("https")
.setPort(5555)
.setPath(uri)
.addParameter("txn",txn);
get.setURI(ruribuilder.build());
CloseableHttpResponse response = httpClient.execute(get);
try {
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode == 200) {
String result = EntityUtils.toString(response.getEntity());
}
else {
//Some Error
}
}catch(Exception e){
e.printStackTrace();
} finally {
EntityUtils.consume(response.getEntity());
}
}
Каждый раз, когда делается запрос, мы создаем новый HTTP-клиент пула размером 10?Если это bean-компонент, инициализированный с помощью Spring Framework, и метод init был вызван во время инициализации bean-компонента, будет ли это сделано только один раз, когда Spring инициализируется или когда будет сделан запрос?