HTTP пул соединений с использованием HttpClient - PullRequest
26 голосов
/ 31 января 2011
  • Как я могу создать пул соединений, используя HttpClient?
  • Мне приходится часто подключаться к одному и тому же серверу. Стоит ли создавать такой бассейн?
  • Можно ли сохранить живые соединения и использовать их для различных запросов, и если да, то как я могу это сделать?

Я занимаюсь разработкой на Java, используя Apache HTTP Client .

Ответы [ 7 ]

20 голосов
/ 13 ноября 2013

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

20 голосов
/ 15 марта 2016

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

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

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

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

16 голосов
/ 11 января 2013

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

16 голосов
/ 31 января 2011

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

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

8 голосов
/ 21 декабря 2011

Для HttpClient 4x:

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

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

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

2 голосов
/ 26 февраля 2015

Это пример пула соединений 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
0 голосов
/ 15 июля 2015

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

...