Spring Bootの終了コード

1.概要

すべてのアプリケーションは終了時に終了コードを返します。このコードは負の値を含む任意の整数値です。

このクイックチュートリアルでは、Spring Bootアプリケーションから終了コードを返す方法について説明します。

2. Spring Bootと終了コード

起動時に例外が発生すると、Spring Bootアプリケーションはコード 1 で終了します。それ以外の場合、クリーンな終了時には、終了コードとして 0 が提供されます。

SpringはシャットダウンフックをJVMに登録して、 __ApplicationContext が終了時に適切に閉じるようにします。それに加えて、Springはインターフェース org.springframework.boot.ExitCodeGenerator も提供しています。 System.exit() __が呼び出されると、このインタフェースは特定のコードを返すことができます。

3.終了コードの実装

Bootには、終了コードを処理するための3つの方法があります。

ExitCodeGenerator インターフェースと ExitCodeExceptionMapper を使用すると、カスタムの終了コードを指定できます。一方、 ExitCodeEvent を使用すると、終了時に終了コードを読み取ることができます。

3.1. ExitCodeGenerator

ExitCodeGenerator インターフェースを実装するクラスを作成しましょう __. 整数値を返す getExitCode()メソッドを実装する必要があります。

@SpringBootApplication
public class DemoApplication implements ExitCodeGenerator {

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

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

ここでは、 DemoApplication クラスが _ExitCodeGeneratorインタフェースを実装しています。 また、 SpringApplication.run() with SpringApplication.exit() への呼び出しをまとめました。 _

終了時に、終了コードは42になります。

3.2. ExitCodeExceptionMapper

それでは、ランタイム例外に基づいて終了コードを返す方法を調べてみましょう。このために、常に NumberFormatException をスローする __CommandLineRunner を実装し、次に ExitCodeExceptionMapper__型のBeanを登録します。

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

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

ExitCodeExceptionMapper内で、 例外を特定の終了コードに単純にマッピングします。

3.3. ExitCodeEvent

次に、 ExitCodeEvent をキャプチャして、アプリケーションの終了コードを読みます _。 ここでは、 ExitCodeEvents をサブスクライブするイベントリスナーを 登録するだけです(この例では named 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()メソッドが呼び出され、イベントから終了コードを読み取ることができます。

4.まとめ

この記事では、Spring Bootが提供する複数のオプションを使って終了コードを処理しました。

どのアプリケーションでも終了時に正しいエラーコードを返すことが非常に重要です。終了コードは、終了が発生したときのアプリケーションの状態を決定します。それに加えて、それはトラブルシューティングに役立ちます。

コードサンプルはhttps://github.com/eugenp/tutorials/tree/master/spring-boot[over on GitHub]にあります。