针对Spring-boot应用程序捕获应用程序停止事件

问题描述 投票:1回答:3

是否有一种干净的方法来检测弹簧启动应用程序何时停止并执行某些操作?用于停止服务的CommandLineRunner

提前致谢

spring spring-boot
3个回答
1
投票

这取决于你想做什么,但你可以做的一件事是有一个实现SmartLifecycle的bean并实现stop方法。每当上下文停止时,您都会收到回调。请注意,它并不一定意味着进程正在关闭。如果你想在发生这种情况时调用一些代码,我会在Sven写的评论中注册一个关闭钩子。


1
投票

我想出了这个解决方案。如果你有更好的,请随意分享

@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###");
}
}

1
投票

不知道你是否完全解决了这个问题。我最近遇到了这个问题,并且得到了一个有点不同的解决方案。

首先,我的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");
    }
}

同时,在Application类上添加注释@ServletComponentScan。

当然,还有一些其他方法可以注册ServletContextListener,一旦注册它,就可以在contextDestroyed函数中获取stop事件。

但是,这与我的问题不太匹配。我必须在春豆被摧毁之前赶上停止事件。这是第二个解决方案。

修改你的应用程序主要方法,如下所示:

    SpringApplication application = new SpringApplication(DemoApplication.class);
    application.addListeners(new MyListener());
    application.run(args);

并提供类MyListener的定义:

class MyListener implements ApplicationListener<ContextClosedEvent>{

    @Override
    public void onApplicationEvent(ContextClosedEvent contextClosedEvent) {
        // your code here
    }
}

注意:第二个解决方案与Tomcat或其他Web容器无关。 SpringClosedEvent并没有在Spring文档中引入,但是我在源代码中发现它,我认为它非常有用。

如果这可以帮助某个人,我将非常高兴。

© www.soinside.com 2019 - 2024. All rights reserved.