Durante un tiempo, he estado usando HttpClient en un entorno multiproceso. Para cada hilo, cuando inicia una conexión, creará una instancia de HttpClient completamente nueva.
Recientemente, descubrí que, al usar este enfoque, puede hacer que el usuario tenga demasiados puertos abiertos y la mayoría de las conexiones estén en estado TIME_WAIT.
http://www.opensubscriber.com/message/commons-httpclient-dev@jakarta.apache.org/86045.html
Por lo tanto, en lugar de hacer cada hilo:
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, 50 ++ subprocesos accederán simultáneamente a global_c. Me preguntaba, ¿esto creará problemas de rendimiento? ¿MultiThreadedHttpConnectionManager utiliza un mecanismo sin bloqueo para implementar su política segura para subprocesos?
Si 10 subprocesos utilizan global_c, ¿se bloquearán los otros 40 subprocesos?
¿O sería mejor si, en cada hilo, creo una instancia de un HttpClient, pero libero el administrador de conexión explícitamente?
[MÉTODO B]
MultiThreadedHttpConnectionManager connman = new MultiThreadedHttpConnectionManager();
HttpClient c = new HttpClient(connman);
try {
c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
connman.shutdown();
}
¿Connman.shutdown () sufrirá problemas de rendimiento?
¿Puedo saber qué método (A o B) es mejor para la aplicación con hilos 50 ++?