Mise en commun des connexions HTTP par HttpClient

  • Comment puis-je créer un pool de connexions en utilisant HttpClient?
  • je dois faire des connexions fréquentes au même serveur. Vaut-il la création d'une telle piscine?
  • Est-il possible de garder les connexions et l'utiliser pour diverses demandes, et si oui, comment puis-je le faire?

je me développe en Java, en utilisant Client HTTP Apache.

20
demandé sur PLNech 2011-01-31 16:42:57

7 réponses

[en supposant que Java, et Apache HttpClient]

un ThreadSafeClientConnManager. Passez une instance globale unique au constructeur de chaque instance HttpClient. Je ne pense pas qu'il n'y a aucun point en commun de la HttpClients eux-mêmes.

15
répondu Tom Anderson 2018-08-12 07:28:27

PoolingClientConnectionManager est déprécié maintenant . à partir de (4.3 version) utiliser PoolingHttpClientConnectionManager.

19
répondu pssh 2014-11-28 10:26:04

ThreadSafeClientConnManager est obsolète maintenant, utilisez PoolingClientConnectionManager à la place.

16
répondu Manoj N V 2015-03-25 14:21:20

j'ai passé ces derniers jours à travailler là-dessus donc je veux juste partager quelques connaissances "tout le monde-connu" avec vous.

tout d'abord, comme vous avez affaire au même serveur, il est recommandé d'utiliser un seul client HTTP pour exécuter vos requêtes. Avec l'aide de PoolingHttpClientConnectionManager, votre client peut être utilisé pour exécuter plusieurs requêtes simultanément. L'exemple officiel de l'exécution d'une requête multithread peut être trouvé ici.

Deuxièmement, HTTP / 1.1 (et les versions améliorées de HTTP / 1.0) permet aux clients HTTP de garder les connexions ouvertes après les transactions complètes afin qu'il puisse être réutilisé pour des requêtes futures. Ceci est souvent désigné comme Connexion Persistante.

également dans le but de réutiliser le client pour des requêtes multiples, l'en-tête de réponse d'un serveur inclut souvent un appel d'attribut Keep-Alive qui contiennent la connexion de courant de temps sera maintenu vivant. En outre, le Client Http Apache vous fournit également une interface ConnectionKeepAliveStrategypour personnalisez votre propre politique pour réutiliser la connexion.

14
répondu eriknguyen 2017-08-09 07:32:00

Pour HttpClient 4x:

ThreadSafeClientConnManager ... gère un bassin de clients les connexions et est capable de gérer les requêtes de connexion à partir de plusieurs threads d'exécution.

les correspondances sont regroupées par route. Une demande pour une route pour laquelle le directeur a une connexion persistante disponible dans la piscine sera desservi par la location d'un connexion à partir de la piscine plutôt que de pour créer une nouvelle connexion.

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

7
répondu serg.nechaev 2011-12-21 00:22:28

ceci est un exemple D'un ensemble de connexions Apache HttpClient 4.3 qui ne nécessitent pas d'authentification:

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
1
répondu Octavian Ionel 2015-02-26 16:26:43

HttpClient a déjà un pool de connexion.Donc vous n'avez pas besoin de le créer. Juste l'utiliser.

-2
répondu Charon Chui 2015-07-15 09:47:25