Через некоторое время 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

Ниже приведены потоки jvisualvm в то время, когда код не работает

jvisualvm темы

jvisualvm темы

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 по сети!?

Другие вопросы по тегам