Есть ли чистый способ обнаружить, когда приложение весенней загрузки остановлено и выполнить какое-либо действие раньше? Вид CommandLineRunner для остановки службыСобытие остановки приложения для приложения Spring-boot
Заранее спасибо
Есть ли чистый способ обнаружить, когда приложение весенней загрузки остановлено и выполнить какое-либо действие раньше? Вид CommandLineRunner для остановки службыСобытие остановки приложения для приложения Spring-boot
Заранее спасибо
Это зависит от того, что вы хотите сделать, но одна вещь, которую вы могли бы сделать, это есть компонент, который реализует SmartLifecycle
и реализовать метод stop
. Всякий раз, когда контекст останавливается, вы получаете обратный вызов. Обратите внимание, что это не обязательно означает, что процесс завершается. Если вы хотите вызвать какой-то код, когда это произойдет, я зарегистрирую крюк остановки, как писал Свен в комментарии.
Я придумал это решение. Если у вас есть лучшие, не стесняйтесь делиться ими.
@Component
public class PortalServiceLifeCycle implements CommandLineRunner {
static final Logger LOGGER = LoggerFactory.getLogger(PortalServiceLifeCycle.class);
@Override
public void run(String... arg0) throws Exception {
LOGGER.info("###START FROM THE LIFECYCLE###");
}
@PreDestroy
public void onExit() {
LOGGER.info("###STOP FROM THE LIFECYCLE###");
}
}
Не знаю, решите ли вы эту проблему. Недавно я встречаю эту проблему и имею решение, которое немного отличается.
Во-первых, мое приложение загрузки Spring - это встроенный Tomcat. (Второй метод этой проблемы не зависит от веб-структуры. Не сумасшедший, мой друг.) В этом случае, естественно, получить идею поймать событие остановки, зарегистрировав прослушиватель. Я делаю это так,
@WebListener
public class HelloListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("HelloListener contextInitialized");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("HelloListener contextDestroyed");
}
}
и, в то же время, добавить аннотацию @ServletComponentScan на классе приложений.
Конечно, есть еще несколько способов зарегистрировать ServletContextListener, и как только вы зарегистрировали его, вы можете получить событие остановки в функции contextDestroyed.
НО, это не соответствует моей проблеме. Я должен поймать событие остановки до того, как будут уничтожены весенние бобы. И вот второе решение.
изменить прикладную основной метод, как следующие:
SpringApplication application = new SpringApplication(DemoApplication.class);
application.addListeners(new MyListener());
application.run(args);
и обеспечить Defination класса MyListener:
class MyListener implements ApplicationListener<ContextClosedEvent>{
@Override
public void onApplicationEvent(ContextClosedEvent contextClosedEvent) {
// your code here
}
}
Примечание: второе решение не имеет ничего общего с Tomcat или другой веб-контейнере , ContextClosedEvent не представлен в документе Spring, но я нашел его в источнике, это очень полезно, я думаю.
Я буду очень рад, если это поможет кому-то.
Вы можете посмотреть, например, http://docs.spring.io/spring/docs/4.1.6.RELEASE/spring-framework-reference/html/beans.html#beans-java. Там вы можете вызвать registerShutdownHook() в AbstractApplicationContext в не-веб-приложениях. –