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

Я развиваю на Java, используя Apache HTTP Client.Пул соединений HTTP-соединений с использованием HttpClient

+1

О чем вы говорите? Добавьте некоторые важные детали, например, язык программирования. Я знаю, что HttpClient написан на Java, Ruby и PHP по крайней мере. – chx

+0

Я добавил информацию о языке и пакете – John

ответ

14

[при условии, Java, и в Apache HttpClient]

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

+0

Позднее он был заменен на 'org.apache.http.impl.conn.PoolingHttpClientConnectionManager' –

7

Для HttpClient 4x:

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

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

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

15

ThreadSafeClientConnManager осуждается теперь использовать PoolingClientConnectionManager вместо этого.

+19

' PoolingClientConnectionManager' устарел, используйте [PoolingHttpClientConnectionManager] (http://hc.apache.org/ httpcomponents-client-ga/httpclient/apidocs/org/apache/http/impl/conn/PoolingHttpClientConnectionManager.html) (привет от 2015 г.) –

+0

https://stackoverflow.com/questions/15336477/deprecated-java-httpclient-how- hard-can-it-be –

18

PoolingClientConnectionManager Устаревший сейчас. из (4.3 версия) использование PoolingHttpClientConnectionManager.

+0

Похожие темы: https://stackoverflow.com/questions/15336477/deprecated-java-httpclient-how-hard-can-it-be –

1

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

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 
-2

HttpClient уже есть соединение pool.So вам не нужно, чтобы создать его. Просто используйте его.

11

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

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

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

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

Смежные вопросы