Chúng tôi đang sử dụng API HttpURLConnection để gọi một API REST cho cùng một nhà cung cấp thường xuyên (loại một tập hợp truy vấn). Chúng tôi muốn giữ một nhóm 5 kết nối luôn mở cho máy chủ của nhà cung cấp (luôn là cùng một IP).cách giữ nhiều Java HttpConnections mở đến cùng một đích
Giải pháp thích hợp là gì? Dưới đây là những gì chúng tôi đã thử:
System.setProperty("http.maxConnections", 5); // set globally only once
...
// everytime we need a connection, we use the following
HttpURLConnection conn = (HttpURLConnection) (new URL(url)).openConnection();
conn.setRequestMethod("GET");
conn.setDoInput(true);
conn.setDoOutput(false);
conn.setUseCaches(true);
...
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
...
Tại thời điểm này, chúng tôi đọc luồng đầu vào cho đến khi BufferedReader trả về không còn byte. Chúng tôi làm gì sau thời điểm đó nếu chúng tôi muốn sử dụng lại kết nối cơ bản cho nhà cung cấp? Chúng tôi đã có ấn tượng rằng nếu luồng đầu vào hoàn toàn được đọc, kết nối sẽ được thêm trở lại vào hồ bơi.
Đó là được làm việc trong vài tuần theo cách này, nhưng ngày nay nó đã ngừng làm việc sản xuất hợp ngoại lệ này: java.net.SocketException: Too many open files
Chúng tôi tìm thấy nhiều ổ cắm ở bang CLOSE_WAIT như thế này (bằng cách chạy lsof
): java 1814 root 97u IPv6 844702 TCP colinux:58517->123.123.254.205:www (CLOSE_WAIT)
Won hoặc conn.getInputStream(). close() hoặc conn.disconnect() đóng hoàn toàn kết nối và xóa nó khỏi nhóm?
Cảm ơn, bạn là đúng, chúng tôi đã không đọc dòng lỗi trong quá trình một lỗi. Điều gì về 'stream.close()' và 'conn.disconnect()'? Họ có ok để sử dụng hoặc họ sẽ đánh bại mục đích của http giữ sống? Tôi đọc một nơi nào đó khi tôi đã viết mã mà bạn nên đọc hoàn toàn luồng, nhưng không đóng nó, nhưng tôi không thể tìm thấy tài liệu tham khảo. – Lightbeard
Bạn không nên đóng luồng cũng như ngắt kết nối nếu muốn sử dụng lại kết nối. Như tôi đã nói, vẫn có thể có rò rỉ ổ cắm ngay cả khi bạn làm mọi thứ đúng, ít nhất là trên Java 5. –