Через некоторое время Tomcat перестает работать с другими API
Я пытаюсь сделать проект более стабильным. Проблема в том, что в какой-то момент возникает ситуация, когда весь код, использующий связь с другими API, перестает работать. Пока я не перезагружаю кота, то, что я должен делать каждые несколько часов (от 4 часов до нескольких минут, похоже, зависит от количества пользователей). В то же время код, который принимает GET (или любой другой) запрос и не связывается с другими серверами во время своей работы - он продолжает работать. Связь с другими серверами теряется и другими проектами на этом сервере.
Сервер Ubuntu 12.04, nginx 1.12.0, tomcat 9.0.0.M26. На сервере есть 12 небольших проектов на Java. Spring 5.0.4.RELEASE, hibernate 5.2.16.Final, (PostgreSQL) 9.6.3
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
Я также получаю много других ошибок в разных местах и разных типах, чаще всего NPE (потому что из-за отсутствия связи объект, который я хотел от другого сервера = null), иногда я получаю HttpClientErrorException и статус 400, хотя удаленный сервер всегда отвечает на аналогичные запросы со статусом 200. На моем местном коте я никогда не сталкивался с подобной ситуацией. Я давно мучаюсь с этой проблемой, ситуация ухудшается (больше пользователей - быстрее ломается), буду благодарен за любые советы. Я прошу прощения за Google переводчик.
Дамп потока из jstack - threaddumps.log
Ниже приведены потоки jvisualvm в то время, когда код не работает
3 ответа
Решением было переместить объявление RestTemplate из глобального в локальное. В дополнение к добавленным значениям "application/json" в RestTemplate, "text/plain" и "/" также были автоматически добавлены. В моем классе, где собирались методы доступа к API, каждый раз, когда использование RestTemplate приводило к добавлению этой информации, в результате заголовок увеличивался до тех пор, пока я не получил "заголовок запроса или слишком большой файл cookie".
Было бы правильно обратить на это больше внимания, но симптомы были странными, и это смутило меня. Теперь я понимаю, что одновременная разбивка во всех проектах - это просто совпадение из-за примерно равного количества звонков на другие серверы. И перезагрузка tomcat помогла, потому что заголовок чист в начале. Теперь каждый метод создает свой собственный экземпляр RestTemplate и не накапливает эту добавленную информацию в заголовке.
Спасибо всем, кто помог мне в чате и помог мне принять решение. Я также хочу отметить этот вопрос (и ответы на него) как очень полезный в моей ситуации - Spring RestTemplate - как включить полную отладку / запись запросов / ответов?
Попробуйте перейти на Tomcat 9.0.6. Несколько ошибок было исправлено между 9.0.0 и 9.0.6.
Разумно это показывает все признаки "конфигурации соединения", связанные с балансировкой нагрузки.
Как вы сказали, это происходит, когда набирает большое количество пользователей. Тем не менее, похоже, что в некоторых сетевых запросах используется какой-то тип выделенного объекта RMI.
Сериализованные объекты - это объекты класса Java, которые "после загрузки в готовый стек" затем удаляются в специальный пакет для передачи по сети, аналогично удалению работающего двигателя транспортного средства и его удалению во время его движения и помещению его в другое транспортное средство с пустым моторный отсек для подключения во время его работы.
RMI называется "Удаленный вызов метода". Это означает, что существует очень преднамеренное действие по обработке работающей оперативной JVM на другой удаленной машине с использованием предварительно загруженных запущенных классов Java из JVM, работающей на другой машине, в другую живую JVM по сети!?