Les meilleures Pratiques à Utiliser HttpClient en Environnement Multithread
Pendant un certain temps, j'ai été en utilisant HttpClient dans un environnement multithread. Pour chaque thread, lorsqu'il établit une connexion, il va créer un tout nouveau HttpClient instance.
Récemment, j'ai découvert que, en utilisant cette approche, il peut causer à l'utilisateur d'avoir un trop grand nombre de ports qui sont ouverts et la plupart des connexions sont en état TIME_WAIT.
http://www.opensubscriber.com/message/[email protected]/86045.html
Ainsi, au lieu de chaque thread en train de faire :
HttpClient c = new HttpClient();
try {
c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
}
Nous avons prévu :
MÉTHODE[A]
//global_c is initialized once through
//HttpClient global_c = new HttpClient(new MultiThreadedHttpConnectionManager());
try {
global_c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
}
Dans une situation normale, global_c sera accessible par 50++ threads simultanément. Je me demandais, ça va créer des problèmes de performances? Est MultiThreadedHttpConnectionManager à l'aide d'un lock-free mécanisme de mise en œuvre de son thread-safe de la politique?
Si 10 threads à l'aide de global_c, les autres 40 threads être verrouillé?
Ou serait-ce mieux si, dans chaque thread, j'ai créer une instance d'un HttpClient, mais relâchez le gestionnaire de connexion de façon explicite?
MÉTHODE[B]
MultiThreadedHttpConnectionManager connman = new MultiThreadedHttpConnectionManager();
HttpClient c = new HttpClient(connman);
try {
c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
connman.shutdown();
}
Sera connman.shutdown() souffrent de problèmes de performance?
Pourrais-je savoir quelle méthode (A ou B) est préférable, pour des applications à l'aide d'un 50++ fils?
Vous devez vous connecter pour publier un commentaire.
Certainement Une Méthode parce que ses mises en commun et thread-safe.
Si vous utilisez httpclient 4.x, le gestionnaire de connexion est appelé ThreadSafeClientConnManager. Voir ce lien pour plus de détails (faites défiler jusqu'à "la Mutualisation du gestionnaire de connexion"). Par exemple:
Méthode est recommandée par httpclient de la communauté des développeurs.
Veuillez vous référer http://www.mail-archive.com/[email protected]/msg02455.html pour plus de détails.
Ma lecture de la doc, c'est que HttpConnection lui-même n'est pas considéré comme thread-safe, et donc MultiThreadedHttpConnectionManager fournit une réutilisables piscine de HttpConnections, vous avez un seul MultiThreadedHttpConnectionManager partagée par tous les threads et initialisé exactement une fois. Si vous avez besoin d'un couple de petites améliorations de l'option A.
Ensuite, chaque thread doit être à l'aide de la séquence pour chaque demande, obtenir une connexion à partir de la piscine et de le remettre à l'achèvement de ses travaux - à l'aide d'un bloc finally peut être bon.
Vous devez également code de la possibilité que la piscine n'a pas de connexions disponibles et le processus de l'exception délai.
Que vous êtes en utilisant un pool de connexions, vous n'allez pas fermer les connexions et donc cela ne devrait pas frapper le TIME_WAIT problème. Cette approche ne assuume que chaque thread n'a pas de s'accrocher à la connexion pour longtemps. Notez que l'escroc lui-même est laissé ouvert.
Je pense que vous voulez utiliser ThreadSafeClientConnManager.
Vous pouvez voir comment cela fonctionne ici: http://foo.jasonhudgins.com/2009/08/http-connection-reuse-in-android.html
Ou dans le
AndroidHttpClient
qui l'utilise en interne.Avec HttpClient 4.5 vous pouvez faire ceci:
Remarque que celui-ci met en œuvre Fermer (pour arrêter le gestionnaire de connexion).