当前位置: 首页 > 知识库问答 >
问题:

捕捉Spring启动应用程序的应用程序停止事件

南宫炜
2023-03-14

是否有一种干净的方法来检测spring启动应用程序何时停止,并在停止之前执行一些操作?一种停止服务的CommandLineRunner

提前谢谢

共有3个答案

邹俊豪
2023-03-14

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

黎玺
2023-03-14

不知道你是否已经完美地解决了这个问题。我最近遇到了这个问题,得到了一个稍微不同的解决方案。

首先,我的Spring boot应用程序是一个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函数中获得stop事件。

但是,这与我的问题不太相符。我必须赶在春豆被毁之前赶上去。第二个解决方案来了。

修改您的应用程序main方法,如下所示:

    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容器无关。Spring文档中没有介绍ContextClosedEvent,但我在源代码中找到了它,我认为它非常有用。

如果这能帮助一些人,我将非常高兴。

季城
2023-03-14

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

@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###");
}
}
 类似资料:
  • 我正在登录/注册,当我尝试使用应用程序停止的同一封电子邮件注册时,我添加了这一行 问题是,它仍然不工作,消息显示出来,但应用程序仍然停止工作。(但信息不同。) 这是我用于身份验证的代码

  • 我在我的工作区中使用STS IDE运行了几个Spring Boot应用程序,在我对其中一个项目进行maven更新后,每个项目都在应用程序启动过程后立即停止。我甚至创建了一个最小的例子,只是为了开始一些事情,同样的事情发生了。 这是我的pom.xml 即使是那些入门示例也会在启动后立即停止。我会非常感谢这里的一些帮助。 编辑:正如Alexandru Marina在评论中所说,我使用的是快照而不是稳定

  • 我使用 启动了一个 Spring boot 应用程序。 在我启动命令的终端中执行ctrl-c不会停止应用程序。 那么,阻止它的正确方法是什么呢?

  • 我们的webstart应用程序(不是小程序)遇到了奇怪的启动问题。 启动应用程序会显示应用程序启动屏幕,但javaws进程会在不久后终止,不会在对话框、java控制台或日志文件中显示任何错误消息。javaws似乎只是在实际启动实际应用程序之前停止。无论用户尝试从桌面快捷方式还是从网页启动应用程序,都无关紧要。当从本地计算机使用javaw运行而无需webstart时,相同的应用程序可以正常工作。 应

  • 我试图运行我的spring boot应用程序,设置了以下属性,我希望它继续重试从配置服务器加载属性50次,在任何两次尝试之间等待6秒,即使在此之后,它不能连接到配置服务器,它应该恢复启动或退出(我对重试后spring boot能够做的事情无所谓)。但它似乎并不像预期的那样表现。 我的启动命令- 如果您想要一个嵌入式数据库,请在类路径上放置一个受支持的数据库。如果要从特定配置文件加载数据库设置,则可

  • 为了在生产环境中启动我的Spring Boot应用程序,我的公司有一个执行“java-jar”的系统,我试图在我的Intellij思想中模拟它,并且jar可以正确启动,我也可以用proyect源代码进行调试。 在运行和调试模式下,当我单击stop按钮时,jar突然停止,并显示消息: 并且我无法捕获关闭事件来关闭我的DB连接。我尝试了其他stackoverflow解决方案,如在Main中运行的Spr