Per un po 'di tempo, ho utilizzato HttpClient in un ambiente con multithreading. Per ogni thread, quando avvia una connessione, creerà un'istanza HttpClient completamente nuova.Best practice per l'utilizzo di HttpClient in ambiente con multithreading
Recentemente, ho scoperto che, utilizzando questo approccio, può causare l'apertura di troppe porte e la maggior parte delle connessioni sono nello stato TIME_WAIT.
http://www.opensubscriber.com/message/[email protected]/86045.html
Quindi, invece di ogni thread fare:
HttpClient c = new HttpClient();
try {
c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
}
Abbiamo in programma di avere:
[METODO A]
// global_c is initialized once through
// HttpClient global_c = new HttpClient(new MultiThreadedHttpConnectionManager());
try {
global_c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
}
In una situazione normale, global_c sarà possibile accedere contemporaneamente a thread da 50 ++. Mi stavo chiedendo, questo creerà problemi di prestazioni? MultiThreadedHttpConnectionManager utilizza un meccanismo di blocco per implementare la relativa politica di sicurezza thread?
Se 10 thread utilizzano global_c, gli altri 40 thread saranno bloccati?
O sarebbe meglio se, in ogni thread, creo un'istanza di un HttpClient, ma rilasci esplicitamente il gestore connessioni?
[METODO B]
MultiThreadedHttpConnectionManager connman = new MultiThreadedHttpConnectionManager();
HttpClient c = new HttpClient(connman);
try {
c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
connman.shutdown();
}
Will connman.shutdown() soffrono problemi di prestazioni?
Posso sapere quale metodo (A o B) è migliore, per l'applicazione utilizzando un thread 50 ++?
Quando si chiama "shutdown" su connection manager se il client è globale. –
Quali strumenti/comandi di linux sono utili per eseguire il debug o "visualizzare" il comportamento di ConnectionManager sotto il cofano? Chiedo perché attualmente abbiamo problemi con le connessioni in CLOSE_WAIT e altri effetti e stiamo cercando di trovare un buon modo per vedere cosa sta succedendo esattamente. – Christoph
@WandMaker Sono abbastanza sicuro che chiamereste shutdown quando il programma termina o quando avete finito con un po 'di lavoro in cui non avrete bisogno di alcuna connessione per un po' di tempo. –