1. 概述
每個應用程序在退出時都會返回一個退出碼;這個碼可以是任何整數值,包括負數。
在本快速教程中,我們將瞭解如何從 Spring Boot 應用程序中返回退出碼。
2. Spring Boot 和退出碼
Spring Boot 應用在啓動時發生異常時,會以代碼 1 結束。否則,在乾淨退出時,它會提供 0 作為退出碼。
Spring 通過註冊 shutdown hooks 與 JVM 交互,以確保在退出時 ApplicationContext 能夠優雅地關閉。此外,Spring 還提供了 org.springframework.boot.ExitCodeGenerator 接口。此接口可以在調用 System.exit() 時返回特定的代碼。
3. 實現退出碼
Spring Boot 提供了四種方法,允許我們處理退出碼。
<em>ExitCodeGenerator</em> 接口和 <em>ExitCodeExceptionMapper</em> 允許我們指定自定義退出碼,而 <em>ExitCodeEvent</em> 則允許我們在退出時讀取退出碼。 此外,異常類也可以實現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.exit() 包裹了對 SpringApplication.run() 的調用。
退出時,退出碼現在將為 42。
3.2. <em >ExitCodeExceptionMapper</em >
現在,讓我們瞭解如何根據運行時異常返回退出代碼。為此,我們實現一個 <em >CommandLineRunner</em >>,它始終拋出一個 <em >NumberFormatException</em >>,然後註冊一個類型為 <em >ExitCodeExceptionMapper</em >> 的 Bean:
@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;
};
}
在 <em>ExitCodeExceptionMapper</em> 中,我們只需將異常映射到一個特定的退出碼。
3.3. <em >ExitCodeEvent</em >
接下來,我們將捕獲一個 <em >ExitCodeEvent</em >> 以讀取應用程序的退出碼。為此,我們只需<strong >註冊一個事件監聽器,該監聽器訂閲 <em >ExitCodeEvent</em >s</strong>(在本例中名為 <em >DemoListener</em >):
@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. 以退出碼為條件的異常
異常也可以實現 <em>ExitCodeGenerator</em> 接口。當拋出此類異常時,Spring Boot 會返回由實現中的 <em>getExitCode()</em> 方法提供的退出碼。例如:
public class FailedToStartException extends RuntimeException implements ExitCodeGenerator {
@Override
public int getExitCode() {
return 42;
}
}
如果拋出一個<em>FailedToStartException</em>實例,Spring Boot 將將其識別為<em>ExitCodeGenerator</em>,並報告 42 作為退出碼。
4. 結論
在本文中,我們探討了 Spring Boot 提供的多種處理退出碼的選項。
對於任何應用程序來説,在退出時返回正確的錯誤碼至關重要。退出碼決定了應用程序在退出時所處的狀態,並且有助於故障排除。