我正在开发一个应用程序,它基本上是一个将使用命令行运行的服务。我确实在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 仍然有效。
慕姐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 的使用,这个类似的问题也可能有所帮助。
添加回答
举报
0/150
提交
取消