Spring Boot - Как зарегистрировать хук отключения для приложения без графического интерфейса - PullRequest
0 голосов
/ 18 октября 2018

Я занимаюсь разработкой приложения, которое в основном представляет собой службу, которая будет запускаться из командной строки.У меня есть опция в файле config для отображения GUI.Если пользователь выбирает, чтобы оно отображало окно, тогда я могу вызвать мой метод shutdown(), используя событие WindowClosing из Swing или кнопку выключения.Однако, если пользователь выбирает опцию без 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 ]

0 голосов
/ 18 октября 2018

После дополнительных исследований я реализовал интерфейс SmartLifecycle.Мой метод getPhase() возвращает Integer.MAX_VALUE;, что означает, что бин уничтожается первым.Затем метод stop можно использовать для вызова кода очистки и обеспечения того, чтобы все журналы / другие компоненты доступа к БД оставались живыми.

0 голосов
/ 18 октября 2018

См. API времени выполнения , чтобы зарегистрировать обработчик завершения работы - в основном используйте Thread для вызова метода, когда JVM завершается (обычно или через прерывание, такое как CTRL + C).

В этом случае похоже, что shutdown() будет статическим методом внутри класса, который определяет main(), поэтому что-то вроде этого:

public static void main(String args[]) {
    ...
    if (using command line) {
        Runtime.getRuntime().addShutdownHook(new Thread( () -> shutdown() ));
    }
}

Что касается использования @PreDestroy, этот аналогичный вопрос также может помочь.

...