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.
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.
PoolingClientConnectionManager
est déprécié maintenant . à partir de (4.3 version) utiliser PoolingHttpClientConnectionManager
.
ThreadSafeClientConnManager est obsolète maintenant, utilisez PoolingClientConnectionManager à la place.
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 ConnectionKeepAliveStrategy
pour personnalisez votre propre politique pour réutiliser la connexion.
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
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
HttpClient a déjà un pool de connexion.Donc vous n'avez pas besoin de le créer. Juste l'utiliser.