HttpURLConnection APIを使用して、同じプロバイダーに対してREST APIを頻繁に呼び出しています(一種の集約ユースケース)。5つの接続のプールを常にプロバイダーホストに対して開いたままにします(常に同じIP)。
適切な解決策は何ですか?これが私たちが試したことです:
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()));
...
この時点で、BufferedReaderがバイトを返さなくなるまで入力ストリームを読み取ります。プロバイダーへの基盤となる接続を再利用する場合は、その後どうしますか?入力ストリームが完全に読み取られると、接続がプールに追加されるという印象を受けました。
このように数週間機能していましたが、今日はこの例外の生成が停止しました。java.net.SocketException: Too many open files
lsof
(を実行することにより)次
のようなCLOSE_WAIT状態のソケットが多数見つかりました。java 1814 root 97u IPv6 844702 TCP colinux:58517->123.123.254.205:www (CLOSE_WAIT)
conn.getInputStream()。close()またはconn.disconnect()のいずれかが接続を完全に閉じて、プールから削除しませんか?