Ответ 1
Самый простой способ сделать это, вызвав refresh()
метод в Spring ApplicationContext. Это убьет и перезагрузит все ваши beans, поэтому вы должны быть уверены, что это происходит только тогда, когда это безопасно для вашего приложения.
Я использую Spring Boot, и у меня есть прецедент, когда пользователь может загрузить файл, который должен вызвать перезапуск приложения (поскольку загрузка пользователя используется при создании нескольких beans). Я знаю, что я могу избежать перезапуска приложения, но на данный момент - это то, что я хочу.
Я нашел RestartEndpoint в проекте Spring -Cloud, но похоже, что ApplicationPreparedEvent
уволен. Есть ли другой способ, с помощью которого я могу программно перезапустить Spring приложение для загрузки?
Самый простой способ сделать это, вызвав refresh()
метод в Spring ApplicationContext. Это убьет и перезагрузит все ваши beans, поэтому вы должны быть уверены, что это происходит только тогда, когда это безопасно для вашего приложения.
У меня есть специальный случай, когда мое приложение Spring Boot, работающее на Linux
, должно выполняться как root
.
Поскольку я запускаю приложение как службу systemd
, я могу перезапустить его следующим образом:
Runtime.getRuntime().exec(new String[] { "/bin/systemctl", "restart", "foo" });
Если ваше приложение (надеюсь) не требуется для запуска в качестве root
, можно использовать setuid
wrapper- script или лучше использовать sudo
.
Отметьте этот ответ о том, как это сделать:
https://superuser.com/questions/440363/can-i-make-a-script-always-execute-as-root
В вашем случае может быть возможно использовать конечную точку /refresh (см. http://cloud.spring.io/spring-cloud-config/spring-cloud-config.html#_endpoints) и аннотировать beans, которые зависят от измененная конфигурация с @RefreshScope.