Некоторое время я использовал HttpClient в многопоточной среде. Для каждого потока, когда он инициирует соединение, он создаст совершенно новый экземпляр HttpClient.Лучшая практика использования HttpClient в многопоточной среде
Недавно я обнаружил, что с помощью этого подхода пользователь может открыть слишком много портов, и большинство соединений находятся в состоянии TIME_WAIT.
http://www.opensubscriber.com/message/[email protected]/86045.html
Таким образом, вместо того, чтобы каждый поток делает:
HttpClient c = new HttpClient();
try {
c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
}
Мы планируем:
[Способ A]
// global_c is initialized once through
// HttpClient global_c = new HttpClient(new MultiThreadedHttpConnectionManager());
try {
global_c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
}
В нормальной ситуации, global_c одновременно будут доступны потоки 50 ++. Мне было интересно, это создаст какие-либо проблемы с производительностью? Является ли MultiThreadedHttpConnectionManager использующим механизм блокировки для реализации политики безопасности потоков?
Если 10 потоков используют global_c, будут ли заблокированы остальные 40 потоков?
Или было бы лучше, если бы в каждом потоке я создавал экземпляр HttpClient, но явным образом освобождаю диспетчер соединений?
[МЕТОД B]
MultiThreadedHttpConnectionManager connman = new MultiThreadedHttpConnectionManager();
HttpClient c = new HttpClient(connman);
try {
c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
connman.shutdown();
}
Будет connman.shutdown() страдают проблемы с производительностью?
Могу ли я узнать, какой метод (A или B) лучше для приложения, использующего потоки 50 ++?
Когда вы вызовете «shutdown» в диспетчере соединений, если клиент сделан глобальным. –
Какие инструменты/команды linux полезны для отладки или «визуализации» поведения ConnectionManager под капотом? Я спрашиваю, потому что у нас в настоящее время возникают проблемы с подключениями в CLOSE_WAIT и другими эффектами, и мы изо всех сил пытаемся найти хороший способ увидеть, что именно происходит. – Christoph
@WandMaker. Я уверен, что вы просто вызовете выключение, когда либо программа выйдет, либо когда вы закончите с некоторой периодичностью работы, где вам не понадобятся какие-либо соединения в течение некоторого времени. –