Pool di connessioni HTTP utilizzando HttpClient

  • Come posso creare un pool di connessioni usando HttpClient?
  • Devo fare frequenti connessioni allo stesso server. Vale la pena creare una piscina del genere?
  • È ansible mantenere connessioni live e usarlo per varie richieste, e in caso affermativo come posso farlo?

Sto sviluppando in Java, usando Apache HTTP Client .

[presupponendo Java e HttpClient di Apache]

Utilizzare un ThreadSafeClientConnManager . Passa una singola istanza globale al costruttore di ogni istanza HttpClient. Non penso che ci sia alcun punto nel mettere insieme gli HttpClients.

PoolingClientConnectionManager è ora deprecato. da (versione 4.3) utilizzare PoolingHttpClientConnectionManager .

ThreadSafeClientConnManager è ora deprecato, utilizzare invece PoolingClientConnectionManager .

Ho passato giornate recenti a lavorare su questo, voglio solo condividere con voi alcune conoscenze “conosciute”.

Innanzitutto, poiché hai a che fare con lo stesso server, è consigliabile utilizzare un singolo client HTTP per eseguire le tue richieste. Con l’aiuto di PoolingHttpClientConnectionManager , il tuo client può essere utilizzato per eseguire più richieste contemporaneamente. L’esempio ufficiale dell’esecuzione di una richiesta multithread può essere trovato qui .

In secondo luogo, HTTP / 1.1 (e versioni avanzate di HTTP / 1.0) consente ai client HTTP di mantenere le connessioni aperte dopo aver completato le transazioni in modo che possano essere riutilizzate per richieste future. Questo è spesso indicato come Connessione persistente .

Inoltre, allo scopo di riutilizzare il client per più richieste, l’intestazione della risposta da un server include spesso una chiamata all’attributo Keep-Alive che contiene la connessione corrente che verrà mantenuta triggers. Oltre a ciò, Apache Http Client fornisce anche un’interfaccia ConnectionKeepAliveStrategy per personalizzare la propria politica di riutilizzo della connessione.

Per HttpClient 4x:

ThreadSafeClientConnManager … gestisce un pool di connessioni client ed è in grado di servire le richieste di connessione da più thread di esecuzione.

Le connessioni sono raggruppate in base alla rotta . Una richiesta per una rotta per la quale il gestore ha già una connessione permanente disponibile nel pool verrà servita leasing di una connessione dal pool anziché creare una nuova connessione.

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

Questo è un esempio di un pool Apache HttpClient 4.3 di connessioni che non richiedono l’autenticazione:

 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 

HttpClient ha già un pool di connessioni. Non è necessario crearlo. Basta usarlo.