Через некоторое время Tomcat перестает работать с другими API

Стараюсь сделать проект более стабильным. Проблема в том, что в какой-то момент возникает ситуация, когда весь код, использующий связь с другими API, перестает работать. Пока я не перезагружаю кота, что мне нужно делать каждые несколько часов (от 4 часов до нескольких минут, похоже, это зависит от количества пользователей). При этом код, который принимает GET (или любой другой) запрос и не связывается с другими серверами во время своей активности - продолжает работать. Связь с другими серверами потеряна и другие проекты на этом сервере.

Сервер Ubuntu 12.04, nginx 1.12.0, tomcat 9.0.0.M26. На сервере 12 небольших проектов на java. Spring 5.0.4.RELEASE, спящий режим 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. На моем местном коте у меня никогда не было подобной ситуации. Давно мучаюсь с этой проблемой, ситуация ухудшается (больше пользователей - быстрее ломается), буду благодарен за любой совет. Прошу прощения за гугл переводчик.

Дамп потока из jstack - threaddumps.log

Через некоторое время Tomcat перестает работать с другими API

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

Через некоторое время Tomcat перестает работать с другими API

Через некоторое время Tomcat перестает работать с другими API

Через некоторое время Tomcat перестает работать с другими API

Дамп потока за несколько секунд до того, как все сломается

Дамп потока в момент, когда код не работает

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
279
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Попробуйте перейти на Tomcat 9.0.6. Было исправлено несколько ошибок между 9.0.0 и 9.0.6.

OP даже использует промежуточный выпуск, а не правильный выпуск. Я бы не стал вкладывать ни минуты в то, что происходит по этому поводу: D.

Pavel Horal 08.04.2018 04:18

Я тоже думал об этом, но это не помогло.

E238 08.04.2018 11:35

Достаточно много он показывает все признаки "конфигурации подключения", касающиеся балансировки нагрузки.

Как вы сказали, он делает это, когда привлекает большое количество пользователей. Однако похоже, что он использует какой-то тип изолированного объекта RMI в некоторых сетевых запросах

Сериализованные объекты - это объекты класса Java, которые «после загрузки в стек готовы» затем удаляются в специальный пакет для передачи по сети, аналогично удалению работающего двигателя транспортного средства и его удалению во время его работы и помещению в другое транспортное средство с пустым моторный отсек для подключения во время работы.

RMI называется «удаленным вызовом метода». Это означает, что существует очень преднамеренное действие по обработке действующей оперативной JVM на другой удаленной машине с использованием предварительно загруженных запущенных классов java из JVM, запущенной на другой машине, в другую действующую JVM по сети! ?

Ответ принят как подходящий

Решением было переместить объявление RestTemplate с глобального на локальное. Помимо добавленных значений «application / json» в RestTemplate, также автоматически добавлялись «text / plain» и «/». В моем классе, где были собраны методы доступа к API, каждый раз использование RestTemplate приводило к добавлению этой информации, в результате заголовок увеличивался до тех пор, пока я не получил «Заголовок запроса или файл cookie слишком велик».

Было бы правильно уделить этому больше внимания, но симптомы были странные, и это меня смущало. Теперь я понимаю, что одновременная поломка во всех проектах - просто совпадение из-за примерно равного количества обращений к другим серверам. И перезагрузка tomcat помогла, потому что заголовок вначале чистый. Теперь каждый метод создает свой собственный экземпляр RestTemplate и не накапливает эту добавленную информацию в заголовке.

Спасибо всем, кто помогал мне в чате и помог принять решение. Я также хочу отметить этот вопрос (и ответы на него) как очень полезный в моей ситуации - Spring RestTemplate - как включить полную отладку / ведение журнала запросов / ответов?

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