Dans les versions précédentes de HttpClient
, l'hôte cible était configuré dans le client lui-même. Dans la dernière version (pour HttpAsyncClient
c'est 4.1.1) l'hôte est mis en place dans HttpRequest
(HttpGet
, HttpPost
etc.) chaque fois que je fais une demande.Comment fonctionne HttpAsyncClient 4?
Je souhaite utiliser une connexion persistante, donc j'utilise HttpAsyncClient
. Créer et utiliser comme ceci:
CloseableHttpAsyncClient client = HttpAsyncClients.createDefault();
client.start();
List<Future<HttpResponse>> responses = new ArrayList<>();
for (int i = 0; i < 10; i++)
{
HttpGet get = new HttpGet("https://google.com/");
responses.add(client.execute(get, null));
}
for (Future<HttpResponse> response : responses) {
response.get(); //wait for the response
}
Comme je l'ai testé, il fonctionne plus vite que d'habitude HttpClient
(si je fais toutes les demandes, puis attendre toutes les réponses).
Mais je ne peux pas entièrement comprendre, comment cela fonctionne à l'intérieur. Combien de connexions avec https://google.com/
sont établies? Que se passe-t-il si j'utilise client
pour un hôte, puis pour un autre? (comme je l'ai testé, les réponses peuvent venir dans n'importe quel ordre, donc je suppose qu'il y a au moins 2 connexions en parallèle). Quelle est la différence entre HttpAsyncClients.createDefault()
et HttpAsyncClients.createPipelining()
?
Merci!
Votre question est un peu compliqué, à savoir, trop abstraite et appartient peut-être dans un autre forum. Je n'ai pas cherché de spécifications, mais je suppose que HttpAsyncClient crée un Thread parce que la classe Future fait partie du package de simultanéité. Par conséquent, votre programme crée dix threads d'arrière-plan qui s'exécutent indépendamment sur les différents cœurs de votre ordinateur. Mon portable très basique a quatre cœurs, donc j'obtiens quatre fois l'amélioration des performances lorsque je cours plusieurs threads. Si vous utilisez le HttpClient habituel, vous faites 10 requêtes séquentielles, attendant que chacune d'elles se termine avant que la suivante ne commence. –
Future peut être utilisé dans HttpAsyncClient à cause du travail asynchrone avec HTTP (la méthode javadoc at execute() le confirme). Donc non, il ne s'agit pas seulement de threads (même si je suis d'accord - il y a sûrement des threads (daemons) créés dans HttpAsyncClient). – coolguy
HttpAsyncClient utilise un petit nombre de threads de répartition d'e/s (égal au nombre de cœurs de processeur par défaut) pour effectuer la gestion et le traitement des messages. – oleg