Je développe en Java, en utilisant Apache HTTP Client .
[en supposant Java et HttpClient d'Apache]
Utilisez un ThreadSafeClientConnManager . Passez une seule instance globale au constructeur de chaque instance HttpClient. Je ne pense pas qu'il soit inutile de regrouper les HttpClients eux-mêmes.
PoolingClientConnectionManager
est obsolète maintenant. à partir de (version 4.3), utilisez PoolingHttpClientConnectionManager
.
J'ai passé ces derniers jours à travailler sur ce sujet, alors je veux juste partager avec vous quelques connaissances "connues de tous".
Tout d'abord, comme vous traitez avec le 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) permettent aux clients HTTP de garder les connexions ouvertes une fois les transactions terminées afin de pouvoir les réutiliser pour de futures demandes. Ceci est souvent appelé Connexion persistante .
Toujours dans le but de réutiliser le client pour plusieurs demandes, l'en-tête de réponse d'un serveur inclut souvent un appel d'attribut Keep-Alive
contenant l'heure à laquelle la connexion actuelle sera maintenue. En plus de cela, Apache Http Client vous fournit également une interface ConnectionKeepAliveStrategy
pour personnaliser votre propre politique de réutilisation de la connexion.
ThreadSafeClientConnManager est obsolète maintenant, utilisez plutôt PoolingClientConnectionManager .
Pour HttpClient 4x:
ThreadSafeClientConnManager ... gère un pool de connexions client et est capable de traiter les demandes de connexion à partir de plusieurs threads d'exécution.
Les connexions sont regroupées par itinéraire . Une demande de route pour laquelle le gestionnaire dispose déjà d'une connexion persistante disponible dans le pool sera traitée en louant une connexion à partir du pool plutôt que de créer un toute nouvelle connexion.
http://hc.Apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html
Voici un exemple d'un pool de connexions Apache HttpClient 4.3 qui ne nécessite 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