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]にあります。