Перейти к основному содержимому

Коды выхода Spring Boot

· 3 мин. чтения

1. Обзор

Каждое приложение возвращает код выхода при выходе; этот код может быть любым целым числом, включая отрицательные значения.

В этом кратком руководстве мы узнаем, как мы можем возвращать коды выхода из приложения Spring Boot.

2. Весенняя загрузка и коды выхода

Приложение Spring Boot завершится с кодом 1 , если при запуске возникнет исключение. В противном случае при чистом выходе он предоставляет 0 в качестве кода выхода.

Spring регистрирует перехватчики завершения работы с JVM, чтобы обеспечить корректное закрытие ApplicationContext при выходе. В дополнение к этому Spring также предоставляет интерфейс org.springframework.boot.ExitCodeGenerator . Этот интерфейс может возвращать определенный код при вызове System.exit() .

3. Внедрение кодов выхода

Spring Boot предоставляет четыре метода, которые позволяют нам работать с кодами выхода.

Интерфейс ExitCodeGenerator и ExitCodeExceptionMapper позволяют нам указывать пользовательские коды выхода, а ExitCodeEvent позволяет нам читать код выхода при выходе. Более того, для исключений даже возможна реализация интерфейса ExitCodeGenerator .

3.1. ExitCodeGenerator

Создадим класс, реализующий интерфейс ExitCodeGenerator . Нам нужно реализовать метод getExitCode() , который возвращает целочисленное значение:

@SpringBootApplication
public class ExitCodeGeneratorDemoApplication implements ExitCodeGenerator {

public static void main(String[] args) {
System.exit(SpringApplication
.exit(SpringApplication.run(DemoApplication.class, args)));
}

@Override
public int getExitCode() {
return 42;
}
}

Здесь класс ExitCodeGeneratorDemoApplication реализует интерфейс ExitCodeGenerator . Кроме того, мы обернули вызов SpringApplication.run() с помощью SpringApplication.exit() .

При выходе код выхода теперь будет 42.

3.2. ExitCodeExceptionMapper

Теперь давайте выясним, как мы можем вернуть код выхода на основе исключения времени выполнения . Для этого мы реализуем CommandLineRunner , который всегда генерирует исключение NumberFormatException , а затем регистрируем bean-компонент типа ExitCodeExceptionMapper :

@Bean
CommandLineRunner createException() {
return args -> Integer.parseInt("test") ;
}

@Bean
ExitCodeExceptionMapper exitCodeToexceptionMapper() {
return exception -> {
// set exit code based on the exception type
if (exception.getCause() instanceof NumberFormatException) {
return 80;
}
return 1;
};
}

В ExitCodeExceptionMapper мы просто сопоставляем исключение с определенным кодом выхода.

3.3. ExitCodeEvent

Далее мы захватим ExitCodeEvent , чтобы прочитать код выхода нашего приложения . Для этого мы просто регистрируем прослушиватель событий, который подписывается на ExitCodeEvent s (в этом примере он называется DemoListener ):

@Bean
DemoListener demoListenerBean() {
return new DemoListener();
}

private static class DemoListener {
@EventListener
public void exitEvent(ExitCodeEvent event) {
System.out.println("Exit code: " + event.getExitCode());
}
}

Теперь при выходе из приложения будет вызываться метод exitEvent() , и мы сможем прочитать код выхода из события.

3.4. Исключение с кодом выхода

Исключение также может реализовать интерфейс ExitCodeGenerator . При генерации таких исключений Spring Boot возвращает код выхода, предоставленный реализованным методом getExitCode() . Например:

public class FailedToStartException extends RuntimeException implements ExitCodeGenerator {

@Override
public int getExitCode() {
return 42;
}
}

Если мы создадим экземпляр FailedToStartException , Spring Boot обнаружит это исключение как ExitCodeGenerator и сообщит 42 как код выхода.

4. Вывод

В этой статье мы рассмотрели несколько вариантов, предоставляемых Spring Boot для работы с кодами выхода.

Для любого приложения очень важно возвращать правильный код ошибки при выходе. Код выхода определяет состояние приложения, когда произошел выход. Кроме того, это помогает в устранении неполадок.

Примеры кода можно найти на GitHub .