2011-01-31 10 views
20
  • ¿Cómo puedo crear un conjunto de conexiones utilizando HttpClient?
  • Tengo que hacer conexiones frecuentes al mismo servidor. ¿Vale la pena crear un grupo así?
  • ¿Es posible mantener conexiones en vivo y usarlo para varias solicitudes y, en caso afirmativo, cómo puedo hacerlo?

Estoy desarrollando en Java, usando Apache HTTP Client.agrupación de conexiones HTTP utilizando HttpClient

+1

¿De qué estás hablando? Agregue algunos detalles importantes, lenguaje de programación, por ejemplo. Conozco un HttpClient escrito al menos en Java, Ruby y PHP. – chx

+0

He agregado el idioma y la información del paquete – John

Respuesta

14

[asumiendo Java y Apache de HttpClient]

Utilice un ThreadSafeClientConnManager. Pasar una sola instancia global al constructor de cada instancia de HttpClient. No creo que tenga sentido agrupar los HttpClients.

+0

Más tarde fue reemplazado por 'org.apache.http.impl.conn.PoolingHttpClientConnectionManager' –

7

Para HttpClient 4x:

ThreadSafeClientConnManager ... gestiona una agrupación del cliente conexiones y es capaz de atender las solicitudes de conexión de múltiples hilos de ejecución.

Las conexiones se agrupan según la ruta. Una solicitud de una ruta para la cual el administrador ya tiene una conexión permanente disponible en el grupo será atendida mediante el arrendamiento de una conexión del en el grupo en lugar de crear una conexión completamente nueva.

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

15

ThreadSafeClientConnManager es obsoleto ahora, utilizar PoolingClientConnectionManager lugar.

+19

' PoolingClientConnectionManager' está en desuso, use [PoolingHttpClientConnectionManager] (http://hc.apache.org/ httpcomponents-client-ga/httpclient/apidocs/org/apache/http/impl/conn/PoolingHttpClientConnectionManager.html) (saludo de 2015) –

+0

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

18

PoolingClientConnectionManager está Obsoleto ahora. desde (4.3 versión) use PoolingHttpClientConnectionManager.

+0

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

1

Este es un ejemplo de un Apache 4.3 HttpClient grupo de conexiones que no requieren autenticación:

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 ya tienen una conexión pool.So que no es necesario para crearlo. Solo úsalo.

11

He pasado los últimos días trabajando en esto, así que quiero compartir algunos conocimientos "conocidos por todos".

En primer lugar, como se trata del mismo servidor, se recomienda utilizar un único cliente HTTP para ejecutar sus solicitudes. Con la ayuda de PoolingHttpClientConnectionManager, su cliente puede ser utilizado para ejecutar múltiples solicitudes al mismo tiempo. El ejemplo oficial de ejecución de solicitud multiproceso se puede encontrar here.

En segundo lugar, HTTP/1.1 (y versiones mejoradas de HTTP/1.0) permite a los clientes HTTP mantener las conexiones abiertas después de completar las transacciones para que puedan reutilizarse para futuras solicitudes. Esto a menudo se denomina Conexión persistente.

También con el propósito de reutilizar el cliente para múltiples solicitudes, el encabezado de respuesta de un servidor a menudo incluye una llamada de atributo Keep-Alive que contiene el tiempo de la conexión actual se mantendrá con vida.Además de eso, Apache Http Client también le proporciona una interfaz ConnectionKeepAliveStrategy para personalizar su propia política para reutilizar la conexión.

Cuestiones relacionadas