Приложение на основе Spring Boot (Tomcat) в качестве демона - как остановить?
Я написал веб- сервис Spring Boot, который использует встроенный tomcat в качестве контейнера.
В случае перезагрузки системы я хочу сделать резервную копию некоторой информации в базе данных mysql.
В моем веб-сервисе я использую @Scheduled()
а также @PreDestroy
запустить резервную копию.
Это хорошо, когда я останавливаю сервер с ^C.
Но когда я убиваю процесс с помощью скрипта sysV (/etc/init.d
) и команду kill - даже если у демона есть зависимость от mysql, сервер mysql выключается до завершения резервного копирования (что приводит к исключениям SQL в моем журнале).
Причина этого, конечно, в том, что kill только посылает сигнал, чтобы остановить процесс.
Как я могу (из моего скрипта sysv) синхронно остановить работающий весенний загрузочный сервер Tomcat?
2 ответа
Если вы включите привод пружинного стартера, то это обеспечивает конечную точку REST для управления. Одна из предоставленных конечных точек /shutdown
, При достижении этой конечной точки вы получите контролируемое отключение всех ресурсов, что обеспечивает @PreDestroy
будет называться. Так как включение по умолчанию может быть опасным, для его использования вам необходимо добавить в файл application.properties следующее:
endpoints.shutdown.enabled=true
Конечно, после того, как вы выставили эту конечную точку, вам нужно убедиться, что применяется небольшая защита, чтобы никто не мог выключить ваш сервер.
В соответствующей заметке вы можете найти мой ответ на приложение Spring Boot в качестве службы полезным, где я предоставил код для полного сценария init.d, который использует это.
В качестве альтернативы конечной точке "/shutdown" привод также имеет ApplicationPidListener
(не включен по умолчанию), который вы можете использовать для создания pid-файла (который обычно используется в скриптах стиля "init.d" для уничтожения процесса, когда вы хотите остановить его). JVM должна ответить на kill (sigint), и Spring корректно завершит работу.