En iyi Uygulama çok iş Parçacıklı Ortamda HttpClient Kullanımı
Tüm bunlar olurken, çok iş parçacıklı ortamda HttpClient kullanıyorum. Bir bağlantı başlatmak her iş parçacığı için, tamamen yeni bir HttpClient bir örneğini oluşturun.
Son zamanlarda fark ettim ki, bu yaklaşım kullanarak, kullanıcı, çok fazla port açılmış olması neden olabilir, ve bağlantıların çoğu TIME_WAIT durumdadır.
http://www.opensubscriber.com/message/commons-httpclient-dev@jakarta.apache.org/86045.html
Dolayısıyla, iş parçacığı başına yapmak yerine :
HttpClient c = new HttpClient();
try {
c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
}
İçin :
[YÖNTEM]
// global_c is initialized once through
// HttpClient global_c = new HttpClient(new MultiThreadedHttpConnectionManager());
try {
global_c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
}
Normal durumda, global_c aynı anda 50 iş parçacıkları tarafından erişilebilir olacak. Bu herhangi bir performans sorunu ortaya çıkar olup olmadığını merak ediyorum. Olur MultiThreadedHttpConnectionManager kilidi serbest iş parçacığı güvenli politikasını uygulamak için bir mekanizma kullanıyor?
Eğer 10 iş parçacığı global_c, diğer 40 iş parçacığı kilitli kullanıyorsanız mümkün mü?
Yoksa her iş parçacığı için daha iyi olur, her HttpClient için bir örnek oluşturmak, ama Bağlantı Yöneticisi açıkça serbest bırakın.
[YÖNTEM B]
MultiThreadedHttpConnectionManager connman = new MultiThreadedHttpConnectionManager();
HttpClient c = new HttpClient(connman);
try {
c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
connman.shutdown();
}
Olur connman.() kapatma performans sorunları muzdarip?
Daha iyi, uygulama 50 iş parçacığı kullandığınız için hangisi öğrenebilir miyim?
CEVAP
Havuza ve kendi iş parçacığı güvenli Bir çünkü kesinlikle Yöntemi.
Httpclient 4 kullanıyorsanız.x, Bağlantı Yöneticisi denirThreadSafeClientConnManager. Bu daha fazla ayrıntı için link (aşağı kaydırın "bağlantı Havuzu yöneticisi"). Örneğin:
HttpParams params = new BasicHttpParams();
SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
ClientConnectionManager cm = new ThreadSafeClientConnManager(params, registry);
HttpClient client = new DefaultHttpClient(cm, params);
Neden alloca kullanımı() olarak iyi bi...
Kötü bir uygulama tek modül olarak req...
İyi uygulama Boole kontrolleri için Ja...
Uygulama kullanımı C#...
Uygulama kullanımı iyi bir örnek...