Подтвердить что ты не робот

Пул соединений HTTP-соединений с использованием HttpClient

  • Как создать пул соединений с помощью HttpClient?
  • Мне нужно делать частые подключения к одному и тому же серверу. Стоит ли создавать такой пул?
  • Возможно ли поддерживать живые подключения и использовать их для различных запросов, и если да, то как я могу это сделать?

Я развиваюсь на Java, используя Apache HTTP Client.

4b9b3361

Ответ 1

[предполагается, что Java и Apache HttpClient]

Используйте ThreadSafeClientConnManager. Передайте один глобальный экземпляр в конструктор каждого экземпляра HttpClient. Я не думаю, что есть какой-то момент в объединении самих HttpClients.

Ответ 2

PoolingClientConnectionManager теперь устарел. из (версии 4.3) используйте PoolingHttpClientConnectionManager.

Ответ 3

ThreadSafeClientConnManager теперь устарел, вместо этого используйте PoolingClientConnectionManager.

Ответ 4

Я провел последние дни, работая над этим, поэтому просто хочу поделиться с вами "всеми известными" знаниями.

Во-первых, поскольку вы имеете дело с одним и тем же сервером, для выполнения ваших запросов рекомендуется использовать один HTTP-клиент. С помощью PoolingHttpClientConnectionManager ваш клиент может использоваться для одновременного выполнения нескольких запросов. Официальный пример многопоточного выполнения запроса можно найти здесь.

Во-вторых, HTTP/1.1 (и расширенные версии HTTP/1.0) позволяет HTTP-клиентам поддерживать открытые соединения после завершения транзакций, чтобы их можно было повторно использовать для будущих запросов. Это часто называют Постоянное соединение.

Также для повторного использования клиента для нескольких запросов заголовок ответа с сервера часто включает в себя вызов атрибута Keep-Alive, который содержит текущее время, которое будет поддерживаться в текущий момент. Кроме того, Apache Http Client также предоставляет вам интерфейс ConnectionKeepAliveStrategy, чтобы настроить собственную политику для повторного использования соединения.

Ответ 5

Для HttpClient 4x:

ThreadSafeClientConnManager... управляет пулом клиента соединений и может обслуживать запросы на соединение из нескольких потоков выполнения.

Соединения объединяются по принципу маршрута. Запрос маршрута, для которого менеджер уже имеет постоянное соединение, доступное в пуле, будет обслуживаться путем лизинга соединения от пул, а не создание совершенно нового соединения.

http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html

Ответ 6

Это пример пула соединений Apache HttpClient 4.3, который не требует аутентификации:

public class PoolOfHttpConnections{
   static String[] urisToGet = {"http://www.site1.com", "http://www.site2.com"};

    public static void main(String[] args) throws Exception {
           CloseableHttpClient httpclient = HttpClients.createDefault();
           // create a thread for each link
           GetThread[] threads = new GetThread[urisToGet.length];
           for (int i = 0; i < threads.length; i++) {
               HttpGet httpget = new HttpGet(urisToGet[i]);
               threads[i] = new GetThread(httpClient, httpget);
           }

           // start the threads
           for (int j = 0; j < threads.length; j++) {
               threads[j].start();
           }
           // join the threads
           for (int j = 0; j < threads.length; j++) {
               threads[j].join();
           }
    } //end main

    private static class GetThread extends Thread {

            private final CloseableHttpClient httpClient;
            private final HttpContext context;
            private final HttpGet httpget;

            public GetThread(CloseableHttpClient httpClient, HttpGet httpget) {
                   this.httpClient = httpClient;
                   this.context = HttpClientContext.create();
                   this.httpget = httpget;
            }

            @Override
            public void run() {
                   try {
                       CloseableHttpResponse response = httpClient.execute(httpget, context);
                       try {
                           HttpEntity entity = response.getEntity();
                           System.out.println("----------------------------------------");
                           Date date = new Date();
                           System.out.println("Beginning*******************");
                           System.out.println(date.toString());
                           System.out.println("There are "+urisToGet.length+" threads running in parallel!");
                           System.out.println(response.getStatusLine());
                           if (entity != null) {
                              System.out.println("Response content length: " + entity.getContentLength());
                           }
                           System.out.println(EntityUtils.toString(entity));
                           EntityUtils.consume(entity);
                       } finally {
                         response.close();
                         System.out.println("End*******************");
                       }
                   } catch (ClientProtocolException ex) {
                          // Handle protocol errors
                   } catch (IOException ex) {
                          // Handle I/O errors
                   }
            }
    } /*end private class*/  }//end public class PoolOfHttpConnections

Ответ 7

У HttpClient уже есть пул соединений. Поэтому вам не нужно его создавать. Просто используйте его.