Por um tempo, tenho usado HttpClient em um ambiente multithread. Para cada thread, quando ele inicia uma conexão, ele criará uma instância HttpClient completamente nova.
Recentemente, descobri que, usando essa abordagem, pode fazer com que o usuário tenha muitas portas sendo abertas, e a maioria das conexões estão no estado TIME_WAIT.
http://www.opensubscriber.com/message/commons-httpclient-dev@jakarta.apache.org/86045.html
Portanto, em vez de cada thread fazer:
HttpClient c = new HttpClient();
try {
c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
}
Pretendemos ter:
[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();
}
Em uma situação normal, global_c será acessado por 50 ++ threads simultaneamente. Eu queria saber, isso criará problemas de desempenho? O MultiThreadedHttpConnectionManager está usando um mecanismo sem bloqueio para implementar sua política de thread-safe?
Se 10 threads estiverem usando global_c, as outras 40 threads serão bloqueadas?
Ou seria melhor se, em cada thread, eu criasse uma instância de um HttpClient, mas liberasse o gerenciador de conexões explicitamente?
[MÉTODO B]
MultiThreadedHttpConnectionManager connman = new MultiThreadedHttpConnectionManager();
HttpClient c = new HttpClient(connman);
try {
c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
connman.shutdown();
}
O connman.shutdown () sofrerá problemas de desempenho?
Posso saber qual método (A ou B) é melhor, para aplicativos que usam threads de 50 ++?