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

我正在开发一个应用程序,它基本上是一个将使用命令行运行的服务。我确实在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注释,但它没有按预期运行该方法。


任何帮助,将不胜感激。


慕勒3428872
浏览 137回答 2
2回答

慕村9548890

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

慕姐4208626

请参阅运行时 API以注册关闭挂钩 - 基本上使用 Thread 在 JVM 终止时调用方法(通常或通过 CTRL + C 等中断)。在这种情况下,它看起来像是shutdown()定义了的类中的静态方法main(),所以是这样的:public static void main(String args[]) {&nbsp; &nbsp; ...&nbsp; &nbsp; if (using command line) {&nbsp; &nbsp; &nbsp; &nbsp; Runtime.getRuntime().addShutdownHook(new Thread( () -> shutdown() ));&nbsp; &nbsp; }}关于@PreDestroy 的使用,这个类似的问题也可能有所帮助。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java