некорректное завершение работы приложения spring boot на сервисе tomcat в linux

Вопрос или проблема

У меня есть следующее окружение: веб-приложение на Spring Boot (3.1.1), работающее на tomcat 10.x в качестве службы systemd на RHEL9.

Оно использует ehcache, настроенный на постоянство между перезапусками.

Если я запускаю и останавливаю tomcat вручную через ./startup и ./shutdown, я вижу

DEBUG o.e.c.EhcacheManager - Закрытие успешно.

в моем логе. Это означает, что кэш закрыт корректно, и кэш остается валидным после перезапуска.

При запуске и остановке tomcat через сервис я не вижу этой записи в логе, и действительно, кэши не закрываются должным образом и не обновляются после перезапуска.

[Service]
...
ExecStart=/opt/xxx/apache-tomcat/bin/catalina.sh run
ExecStop=/opt/xxx/apache-tomcat/bin/shutdown.sh

Это те же скрипты, которые я запускаю вручную.

Что-то, что я не понимаю, происходит на этапе завершения работы.
Представляет ли остановка сервиса таймаут и затем приводит к некорректной остановке tomcat?

Есть идеи, что это может быть?

С уважением, Стеффен

Предпринятые действия: Уровень логирования EHCacheManager установлен на “запущен”/”остановлен” вручную и через сервис

.

Ответ или решение

Неисправный выключение приложения Spring Boot на Tomcat в Linux

Здравствуйте, Стэффен!

Ваш вопрос о том, почему при запуске и остановке Tomcat как службы systemd отсутствует сообщение о корректном закрытии кэша Ehcache, действительно имеет важное значение для стабильности работы вашего приложения. Позвольте мне подробнее рассмотреть данную проблему.

Проблема

Вы заметили, что при ручном запуске и остановке Tomcat с использованием скриптов startup.sh и shutdown.sh вы получаете сообщение о корректном закрытии кэша. Однако, при использовании systemd для управления сервисом, этого сообщения нет, и кэш не инициализируется правильно после перезапуска.

Возможные причины

  1. Таймаут остановки службы:
    Логи systemd могут указывать на то, что служба, возможно, прерывается из-за достижения предела времени ожидания. По умолчанию, systemd имеет таймаут для stop-операций, который может быть слишком коротким для завершения всех процессов вашего приложения.
    Чтобы проверить это, вы можете увеличить значение параметра TimeoutStopSec в вашем сервисе systemd:

    [Service]
    ...
    TimeoutStopSec=30
  2. Отсутствие корректного сигнала для остановки:
    При запуске службы через systemd может возникнуть ситуация, когда сигнал остановки (например, SIGTERM) не обрабатывается приложением должным образом. Убедитесь, что ваш метод завершения работы обрабатывает возможные сигналы и корректно завершает все запущенные процессы.

  3. Использование скрипта shutdown.sh:
    Поскольку вы используете shutdown.sh для остановки сервиса, убедитесь, что этот скрипт корректно настроен и не содержит ошибок, которые могут влиять на логику остановки вашего приложения. Иногда скрипты могут игнорировать определенные параметры или могут требовать дополнительных флагов.

  4. Версия Java и конфигурация Tomcat:
    Убедитесь, что используемые версии Java и Tomcat совместимы с вашей версией Spring Boot. Необходимо также проверить конфигурации, такие как server.wait-timeout в application.properties или application.yml, чтобы гарантировать, что они соответствуют ожиданиям вашего приложения.

Рекомендации

  • Логи: Проверьте дополнительные логи Tomcat на предмет ошибок или предупреждений, которые могли бы помочь в диагностике проблемы. Логи, такие как catalina.out, могут содержать информацию, которую не видно в других местах.

  • Мониторинг: Установите инструменты мониторинга (например, Prometheus с Grafana) для анализа нагрузки на приложение и использования кэша. Это может помочь выявить скрытые проблемы.

  • Тестирование: Попробуйте временно отключить Ehcache и протестировать поведение приложения, чтобы исключить его как источник проблем. Это может помочь в изоляции проблемы.

Заключение

Проблемы с корректным завершением работы приложения могут привести к неприятностям, связанным с производительностью и стабильностью. Рекомендуется провести анализ вышеперечисленных аспектов и протестировать каждую из рекомендаций, что может помочь в установлении причины вашей проблемы. Удачи в разработке и поддержке вашего приложения!

С уважением,
Ваш эксперт в области IT.

Оцените материал
Добавить комментарий

Капча загружается...