知識庫 / Spring / Spring Boot RSS 訂閱

Spring Boot 退出碼

Spring Boot
HongKong
6
02:02 PM · Dec 06 ,2025

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>&nbsp; 接口。當拋出此類異常時,Spring Boot 會返回由實現中的 <em>getExitCode()</em>&nbsp; 方法提供的退出碼。例如:

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 提供的多種處理退出碼的選項。

對於任何應用程序來説,在退出時返回正確的錯誤碼至關重要。退出碼決定了應用程序在退出時所處的狀態,並且有助於故障排除。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.