Приложение на основе Spring Boot (Tomcat) в качестве демона – как остановить?

Я написал веб-сервис Spring Boot, который использует встроенный кот в качестве контейнера.

В случае перезагрузки системы я хочу сделать резервную копию некоторой информации в базе данных mysql.

В моем веб-сервисе я использую @Scheduled() и @PreDestroy для запуска резервного копирования.

Это хорошо, когда я останавливаю сервер с помощью ^C.

Но когда я завершаю процесс с помощью sysV skript (/etc/init.d) и команды kill, несмотря на то, что демон имеет зависимость от mysql, сервер mysql отключается до завершения резервного копирования (в результате чего SQL Исключения в моем журнале).

Причина этого, конечно же, в том, что kill посылает только сигнал об остановке процесса.

Как я могу (из моего скрипта sysv) синхронно остановить работающий сервер tomcat с весенней загрузкой?


person Alex    schedule 17.11.2013    source источник


Ответы (2)


Если вы включите spring-boot-starter-actuator, это обеспечит конечную точку REST для управления. Одной из предоставленных конечных точек является /shutdown. Нажав на эту конечную точку, вы получите контролируемое отключение всех ресурсов, что гарантирует вызов @PreDestroy. Поскольку это может быть опасно для включения по умолчанию, для его использования вам необходимо добавить следующее в файл application.properties:

endpoints.shutdown.enabled=true

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

В соответствующей заметке вы можете найти мой ответ на приложение Spring Boot как Служба полезна, где я предоставил код для полного сценария init.d, который использует это.

person Steve    schedule 08.05.2014

В качестве альтернативы конечной точке «/shutdown» Actuator также имеет ApplicationPidListener (не включено по умолчанию), который вы можете использовать для создания pid-файла (который обычно используется в сценариях в стиле «init.d», чтобы убить процесс, когда вы хотите остановить его). JVM должна реагировать на уничтожение (sigint), и Spring корректно завершит работу.

person Dave Syer    schedule 08.05.2014