Приложение на основе 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 корректно завершит работу.

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