Comment envoyer des requêtes GET parallèles et attendre les réponses de résultat?
Je suis en utilisant apache http client dans un délai de spring mvc 3.2.2 envoyer 5 demandes de façon synchrone, comme illustré.
Comment puis-je envoyer tous ces asynchrone (en parallèle) et d'attente pour les demandes de retour pour retourner un analysée de la charge utile de la chaîne de toutes les requêtes GET?
public String myMVCControllerGETdataMethod()
{
//Send 1st request
HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet("http://api/data?type=1");
ResponseHandler<String> responseHandler = new BasicResponseHandler();
String responseBody = httpclient.execute(httpget, responseHandler);
//Send 2st request
HttpClient httpclient2 = new DefaultHttpClient();
HttpGet httpget2 = new HttpGet("http://api/data?type=2");
ResponseHandler2<String> responseHandler2 = new BasicResponseHandler();
String responseBody2 = httpclient.execute(httpget, responseHandler2);
//o o o more gets here
//Perform some work here...and wait for all requests to return
//Parse info out of multiple requests and return
String results = doWorkwithMultipleDataReturned();
model.addAttribute(results, results);
return "index";
}
source d'informationauteur JaJ
Vous devez vous connecter pour publier un commentaire.
Juste en général, vous avez besoin pour encapsuler vos unités de travail dans un
Runnable
oujava.util.concurrent.Callable
et de les exécuter viajava.util.concurrent.Executor
(ouorg.springframework.core.task.TaskExecutor
). Cela permet à chaque unité de travail à être exécuté séparément, généralement de façon asynchrone (en fonction de la mise en œuvre de laExecutor
).Donc, pour votre problème spécifique, vous pourriez faire quelque chose comme ceci:
Noter que ce code n'a pas été testé.
Pour votre
Executor
mise en œuvre, découvrez Le printemps TaskExecutor et tâche:exécuteur testamentaire de l'espace de noms. Vous voudrez probablement une réutilisables pool de threads pour ce cas d'utilisation (au lieu de créer un nouveau thread à chaque fois).Vous devez utiliser AsyncHttpClient. Vous pouvez faire un certain nombre de demandes, et il fera un appel de nouveau à vous quand il obtient une réponse. Vous pouvez configurer le nombre de connexions qu'il peut créer. Tous le filetage est gérée par la bibliothèque, de sorte qu'il est beaucoup plus facile que de gérer les threads de vous-même.
prendre un coup d'oeil un exemple ici: https://github.com/AsyncHttpClient/async-http-client
Pour l'exécution en parallèle de la demande multiple avec un seul HttpClient instance.
configurer PoolingHttpClientConnectionManager pour l'exécution en parallèle.