为了账号安全,请及时绑定邮箱和手机立即绑定

Spring Boot - 如何为非 GUI 应用程序注册关闭挂钩

Spring Boot - 如何为非 GUI 应用程序注册关闭挂钩

慕勒3428872 2021-11-24 20:14:47
我正在开发一个应用程序,它基本上是一个将使用命令行运行的服务。我确实在config文件中有一个选项可以显示GUI. 如果用户选择让它显示窗口,那么我可以shutdown()使用WindowClosing来自 Swing的事件或关闭按钮调用我的方法。但是,如果用户选择 no-GUI 选项,我不确定如何确保在命令提示符下按 Control-C 时调用此方法。我的shutdown()方法更新数据库中的一些重要数据并停止线程,所以我需要它运行。我做了一些研究并尝试过这样的事情:public static void main(String args[]) {    //Look and Feel Initialization    try     {        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels())         {            if ("Nimbus".equals(info.getName()))             {                javax.swing.UIManager.setLookAndFeel(info.getClassName());                break;            }        }    }     catch (ClassNotFoundException | IllegalAccessException | InstantiationException | UnsupportedLookAndFeelException ex)     {        logger.error("Error initializing look and feel : " + ex.getMessage());    }     //Application Initialization    SpringApplication application = new SpringApplication(MDHIS_Service.class);    application.addListeners((ApplicationListener<ContextClosedEvent>) (ContextClosedEvent e) ->     {        shutdown();    });    application.run(args);}问题是我的shutdown()方法远非静态。我不知道如何将它连接到 Spring Boot 上下文中,让它在停止之前运行这个方法。我尝试了@PreDestroy注释,但它没有按预期运行该方法。任何帮助,将不胜感激。
查看完整描述

2 回答

?
慕村9548890

TA贡献1884条经验 获得超4个赞

经过更多研究,我最终实现了 SmartLifecycle 接口。我的getPhase()方法返回Integer.MAX_VALUE;,这意味着首先销毁 bean。然后可以使用 stop 方法调用清理代码并确保任何日志记录/其他数据库访问 bean 仍然有效。


查看完整回答
反对 回复 2021-11-24
?
慕姐4208626

TA贡献1852条经验 获得超7个赞

请参阅运行时 API以注册关闭挂钩 - 基本上使用 Thread 在 JVM 终止时调用方法(通常或通过 CTRL + C 等中断)。


在这种情况下,它看起来像是shutdown()定义了的类中的静态方法main(),所以是这样的:


public static void main(String args[]) {

    ...

    if (using command line) {

        Runtime.getRuntime().addShutdownHook(new Thread( () -> shutdown() ));

    }

}

关于@PreDestroy 的使用,这个类似的问题也可能有所帮助。


查看完整回答
反对 回复 2021-11-24
  • 2 回答
  • 0 关注
  • 130 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信