Durante un tiempo, he estado usando HttpClient en un entorno multiproceso. Para cada hilo, cuando inicia una conexión, creará una instancia HttpClient completamente nueva.Mejores prácticas para usar HttpClient en entornos multiproceso
Recientemente, he descubierto que, al usar este enfoque, puede causar que el usuario tenga demasiados puertos abiertos y la mayoría de las conexiones están en el estado TIME_WAIT.
http://www.opensubscriber.com/message/[email protected]/86045.html
Por lo tanto, en lugar de cada hilo haciendo:
HttpClient c = new HttpClient();
try {
c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
}
Planeamos tener:
[MÉTODO A]
// global_c is initialized once through
// HttpClient global_c = new HttpClient(new MultiThreadedHttpConnectionManager());
try {
global_c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
}
En una situación normal, global_c será accedido por 50 ++ hilos al mismo tiempo. Me preguntaba, ¿creará esto algún problema de rendimiento? ¿MultiThreadedHttpConnectionManager utiliza un mecanismo sin bloqueo para implementar su política de seguridad de subprocesos?
Si 10 hilos están usando global_c, ¿se bloquearán los otros 40 hilos?
¿O sería mejor si, en cada hilo, creo una instancia de un HttpClient, pero lanzo el administrador de conexión explícitamente?
[procedimiento B]
MultiThreadedHttpConnectionManager connman = new MultiThreadedHttpConnectionManager();
HttpClient c = new HttpClient(connman);
try {
c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
connman.shutdown();
}
Will connman.shutdown() sufren problemas de rendimiento?
¿Se puede saber qué método (A o B) es mejor, para la aplicación que utiliza un 50 ++ hilos?
¿Cuándo se llamará "shutdown" al administrador de conexión si el cliente se globaliza? –
¿Qué herramientas/comandos de Linux son útiles para depurar o "visualizar" el comportamiento del ConnectionManager bajo el capó? Pregunto porque actualmente tenemos problemas con las conexiones en CLOSE_WAIT y otros efectos, y nos estamos esforzando por encontrar una buena manera de ver qué está sucediendo exactamente. – Christoph
@WandMaker Estoy bastante seguro de que simplemente llamaría al apagado cuando salga el programa o cuando haya terminado con un lote de trabajo en el que no necesitará ninguna conexión durante un tiempo. –