Java SocketException:打开的文件太多

Java SocketException:打开的文件太多,java,tomcat,Java,Tomcat,Web服务-部署在LINUX中的Tomcat 下面是我发送HTTP请求的代码 我读到太多打开的文件是因为客户端没有关闭流并保持它打开 我尝试在下面的代码中关闭我的流 并将ulimit-n数增加到4096,仍然得到这个错误 if ("GET".equals(methodType)) { //req System.setProperty("http.keepAlive", "false"); logger

Web服务-部署在LINUX中的Tomcat 下面是我发送HTTP请求的代码 我读到太多打开的文件是因为客户端没有关闭流并保持它打开 我尝试在下面的代码中关闭我的流 并将ulimit-n数增加到4096,仍然得到这个错误

if ("GET".equals(methodType)) { //req
                        System.setProperty("http.keepAlive", "false");
                        logger.info("<--------CALLING TAX-CLIENT REQUEST------------>");
                        URL url = new URL(api_url + "?" + queryParams);
        //                        URLEncoder.encode(queryParams, "UTF-8"
                        logger.debug("API_URL TO SEND REQUEST : " + url);
                        logger.debug("Received TOKEN IS : " + encoding_token);
                        conn = (HttpsURLConnection) url.openConnection();
                        conn.setRequestProperty("Authorization", "Bearer " + encoding_token);
                        conn.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
                        conn.setRequestProperty("Accept-Charset", "charset=UTF-8");
                        conn.setRequestMethod("GET");
                        conn.setDoInput(true);
                        InputStream _is;
                        /* error from server */
                        if (conn.getResponseCode() == HttpsURLConnection.HTTP_INTERNAL_ERROR) {
                            _is = conn.getErrorStream();
                            logger.error("ERROR : " + _is.toString());
                            throw new BillingException("501", _is.toString(), new BillingExceptionBean());
                        } else {
                            _is = conn.getInputStream();
                        }

                        try (BufferedReader in = new BufferedReader(
                                new InputStreamReader(_is, Charset.forName("UTF-8")), BUFFER_SIZE)) {
                            inputLine = in.readLine();
                            logger.info("Response from tax : " + inputLine);
                            if (inputLine.contains("default message")) {
                                JSONObject jsonObject = new JSONObject(inputLine);
                                String error = jsonObject.getString("code") + ":" + jsonObject.getString("message") + "\n";
                                this.setErrorMessage(error);
                            } else if (inputLine.contains("error") & inputLine.contains("default")) {
                                String str = inputLine;
                                String[] parts = str.split("default message");
                                String str1 = parts[2];
                                String[] parts2 = str1.split("\"");
                                this.setErrorMessage(parts2[0].toString());
                            }
                            logger.info("Buffered Reader is closed");
                            in.close();
                        }
                        logger.info("Input stream is closing connection");
        //                _is.close();
        //                conn.disconnect();

该错误表示
accept()
调用无法接受套接字连接。根据底层文档,此异常有两个潜在原因:流程中打开的文件太多或系统范围内打开的文件太多

有可能存在太多打开的连接。您可以使用
netstat-anp | grep TOMCAT_PROCESS_ID
查看有多少连接涉及到TOMCAT服务器。这将包括来自客户端的入站连接,以及从web应用程序到外部服务的出站连接;入站连接将显示Tomcat端口作为目标。如果您有很多入站连接,那么问题在于有太多的客户端或客户端没有关闭连接(您的示例似乎就是这样)


更有可能的情况是,您没有正确关闭web应用程序(已部署到Tomcat服务器)中的文件。要诊断我是否运行了ls-l/proc/TOMCAT\u PROCESS\u ID/fd,它将为您提供该进程打开的所有文件和套接字的列表。您将在这个列表中看到应用程序WAR,以及Tomcat使用的一些JAR。如果您看到文件系统中有很多文件,请查看它们的打开位置。

请参阅/etc/security/limits了解硬限制您需要阅读以了解如何使用
try/catch/finally
。否则,您会保留应该关闭的打开的内容,导致资源耗尽,在您打开的文件中,是Tomcat泄漏了FDs,而不是您的客户机代码。检查您的servlet、JSP等。感谢您的回答,
ls-l/proc/TOMCAT\u PROCESS\u ID/fd
正如您所说,有许多.jar和.log文件,TOMCAT中部署了一些类,它们是不同的颜色,如红色、绿色、黄色?它们之间有什么区别我不能理解你建议的这一部分“如果你从文件系统中看到很多文件,看看它们是在哪里打开的。”我怎么知道它们在
Feb 21, 2019 9:04:56 AM org.apache.tomcat.util.net.JIoEndpoint$Acceptor run
SEVERE: Socket accept failed
java.net.SocketException: Too many open files
    at java.net.PlainSocketImpl.socketAccept(Native Method)
    at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:404)
    at java.net.ServerSocket.implAccept(ServerSocket.java:545)
    at java.net.ServerSocket.accept(ServerSocket.java:513)
    at org.apache.tomcat.util.net.DefaultServerSocketFactory.acceptSocket(DefaultServerSocketFactory.java:60)
    at org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:220)
    at java.lang.Thread.run(Thread.java:745)