Trong một thời gian, tôi đã sử dụng HttpClient trong môi trường đa luồng. Đối với mỗi luồng, khi nó khởi tạo một kết nối, nó sẽ tạo ra một cá thể HttpClient hoàn toàn mới.Thực hành tốt nhất để sử dụng HttpClient trong môi trường đa luồng
Gần đây, tôi đã phát hiện ra rằng, bằng cách sử dụng phương pháp này, nó có thể khiến người dùng có quá nhiều cổng đang được mở và hầu hết các kết nối đều ở trạng thái TIME_WAIT.
http://www.opensubscriber.com/message/[email protected]/86045.html
Do đó, thay vì mỗi thread thực hiện:
HttpClient c = new HttpClient();
try {
c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
}
Chúng tôi dự định có:
[PHƯƠNG PHÁP A]
// global_c is initialized once through
// HttpClient global_c = new HttpClient(new MultiThreadedHttpConnectionManager());
try {
global_c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
}
Trong một tình huống bình thường, global_c sẽ được truy cập bởi 50 ++ chủ đề đồng thời. Tôi đã tự hỏi, điều này sẽ tạo ra bất kỳ vấn đề hiệu suất? MultiThreadedHttpConnectionManager có sử dụng cơ chế không khóa để thực thi chính sách an toàn của luồng không?
Nếu 10 chủ đề đang sử dụng global_c, 40 chủ đề khác có bị khóa không?
Hoặc sẽ tốt hơn nếu, trong mỗi chủ đề, tôi tạo một thể hiện của HttpClient, nhưng phát hành trình quản lý kết nối một cách rõ ràng?
[PHƯƠNG PHÁP B]
MultiThreadedHttpConnectionManager connman = new MultiThreadedHttpConnectionManager();
HttpClient c = new HttpClient(connman);
try {
c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
connman.shutdown();
}
sẽ connman.shutdown() bị các vấn đề hiệu suất?
Tôi có thể biết phương pháp nào (A hoặc B) tốt hơn, đối với ứng dụng sử dụng chuỗi 50 ++ không?
Khi nào một người gọi "tắt máy" trên trình quản lý kết nối nếu máy khách được tạo ra toàn cầu. –
Những công cụ/lệnh linux nào hữu ích để gỡ rối hoặc "hình dung" hành vi của ConnectionManager dưới mui xe? Tôi hỏi vì chúng tôi hiện đang gặp rắc rối với các kết nối trong CLOSE_WAIT và các hiệu ứng khác và chúng tôi đang tìm kiếm một cách tốt để xem chính xác những gì đang diễn ra. – Christoph
@WandMaker Tôi khá chắc chắn bạn sẽ chỉ cần tắt máy khi một trong hai chương trình thoát hoặc khi bạn kết thúc với một số công việc mà bạn sẽ không cần bất kỳ kết nối nào trong một thời gian. –