Инициализация клиента Java HTTP с помощью Spring - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь понять, как лучше всего использовать 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 инициализируется или когда будет сделан запрос?

1 Ответ

0 голосов
/ 08 июня 2018

Разве это не должно быть статическим или для класса?

  • Для повышения производительности лучше повторно использовать клиент.То, как вы будете использовать повторно - сделайте это статичным или создайте Бин, который будет вводиться - зависит от вас.Иногда вам могут понадобиться несколько разных клиентов с разной конфигурацией, например, тайм-ауты и т. Д.

Если HttpClient с диспетчером подключений в пуле можно использовать повторно и соединения возвращаются обратно в пул, разве мы не создаем HttpClient каждый раз, когда выполняемзапрос?

  • Диспетчер соединений можно использовать повторно, это настраивается.

Каждый раз, когда делается запрос, мы создаем новый клиент HTTP с размером пула 10?

  • При конфигурации по умолчанию - да.

Если это bean-компонент, инициализированный с помощью Spring Framework, и метод init был вызван во время инициализации bean-компонента, будет ли это сделанотолько один раз, когда инициализируется пружина или когда делается запрос?

  • Это зависит не только от одного компонента, который будет создан один раз, но также от конфигурации клиента http и диспетчера соединений

Пожалуйста, обратитесь к Spring RestTemplate - Необходимо разорвать соединение? , http://www.baeldung.com/spring-scheduled-tasks

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...