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 .