SocketException: СЛИШКОМ МНОГО ОТКРЫТЫХ ФАЙЛОВ - PullRequest
0 голосов
/ 21 февраля 2019

Веб-служба - Tomcat, развернутый в LINUX. Ниже приведен мой код, который отправляет 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();

Это ОШИБКА я ПОЛУЧИЛ:

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)

1 Ответ

0 голосов
/ 22 февраля 2019

Ошибка указывает, что вызов accept() не может принять соединение через сокет.Согласно документации базового системного вызова , есть две возможные причины этого исключения: либо у вас слишком много открытых файлов в вашем процессе, либо слишком много открытых файлов в масштабе всей системы.

возможно , что слишком много открытых соединений.Вы можете использовать netstat -anp | grep TOMCAT_PROCESS_ID, чтобы посмотреть, сколько подключений связано с сервером Tomcat.Это будет включать в себя входящие соединения от клиента, а также исходящие соединения из вашего веб-приложения с внешними сервисами;входящие соединения покажут порт Tomcat в качестве пункта назначения.Если у вас много входящих подключений, то это проблема слишком большого количества клиентов или клиентов, которые не закрывают соединение (что, по-видимому, делает ваш пример).

Скорее всего, вы не правильнозакрытие файлов в вашем веб-приложении (которое вы развернули на сервере Tomcat).Чтобы диагностировать, я бы запустил ls -l /proc/TOMCAT_PROCESS_ID/fd, который даст вам список всех файлов и сокетов, которые открываются этим процессом.В этом списке вы увидите WAR приложения и некоторые JAR-файлы, используемые Tomcat.Если вы видите много файлов из вашей файловой системы, посмотрите, где они открыты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...