我正在開發(fā)一個應(yīng)用程序,它基本上是一個將使用命令行運行的服務(wù)。我確實在config文件中有一個選項可以顯示GUI. 如果用戶選擇讓它顯示窗口,那么我可以shutdown()使用WindowClosing來自 Swing的事件或關(guān)閉按鈕調(diào)用我的方法。但是,如果用戶選擇 no-GUI 選項,我不確定如何確保在命令提示符下按 Control-C 時調(diào)用此方法。我的shutdown()方法更新數(shù)據(jù)庫中的一些重要數(shù)據(jù)并停止線程,所以我需要它運行。我做了一些研究并嘗試過這樣的事情: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()方法遠非靜態(tài)。我不知道如何將它連接到 Spring Boot 上下文中,讓它在停止之前運行這個方法。我嘗試了@PreDestroy注釋,但它沒有按預(yù)期運行該方法。任何幫助,將不勝感激。
2 回答

慕村9548890
TA貢獻1884條經(jīng)驗 獲得超4個贊
經(jīng)過更多研究,我最終實現(xiàn)了 SmartLifecycle 接口。我的getPhase()
方法返回Integer.MAX_VALUE;
,這意味著首先銷毀 bean。然后可以使用 stop 方法調(diào)用清理代碼并確保任何日志記錄/其他數(shù)據(jù)庫訪問 bean 仍然有效。

慕姐4208626
TA貢獻1852條經(jīng)驗 獲得超7個贊
請參閱運行時 API以注冊關(guān)閉掛鉤 - 基本上使用 Thread 在 JVM 終止時調(diào)用方法(通?;蛲ㄟ^ CTRL + C 等中斷)。
在這種情況下,它看起來像是shutdown()定義了的類中的靜態(tài)方法main(),所以是這樣的:
public static void main(String args[]) {
...
if (using command line) {
Runtime.getRuntime().addShutdownHook(new Thread( () -> shutdown() ));
}
}
關(guān)于@PreDestroy 的使用,這個類似的問題也可能有所幫助。
添加回答
舉報
0/150
提交
取消