Spring Boot Exit Codes

Spring Boot-Beendigungscodes

1. Überblick

Jede Anwendung gibt beim Beenden einen Beendigungscode zurück. Dieser Code kann ein beliebiger ganzzahliger Wert sein, einschließlich negativer Werte.

In diesem kurzen Tutorial erfahren Sie, wie Sie Exit-Codes aus einer Spring Boot-Anwendung zurückgeben können.

2. Spring Boot und Exit Codes

Eine Spring Boot-Anwendung wird mit dem Code1 beendet, wenn beim Start eine Ausnahme auftritt. Andernfalls wird bei einem sauberen Exit0 als Exit-Code angegeben.

Spring registriert Shutdown-Hooks bei der JVM, um sicherzustellen, dassApplicationContext beim Beenden ordnungsgemäß geschlossen wird. Darüber hinaus stellt Spring auch die Schnittstelleorg.springframework.boot.ExitCodeGenerator bereit. Diese Schnittstelle kann den spezifischen Code zurückgeben, wennSystem.exit()  aufgerufen wird.

3. Exit-Codes implementieren

Boot bietet drei Methoden, mit denen wir mit Exit-Codes arbeiten können.

Über dieExitCodeGenerator-Schnittstelle undExitCodeExceptionMapper können wir benutzerdefinierte Exit-Codes angeben, während mitExitCodeEvent der Exit-Code beim Beenden gelesen werden kann.

3.1. ExitCodeGenerator 

Erstellen wir eine Klasse, die dieExitCodeGenerator-Schnittstelle.implementiert. Wir müssen die MethodegetExitCode()implementieren, die einen ganzzahligen Wert zurückgibt:

@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;
    }
}

Hier implementiert die KlasseDemoApplicationExitCodeGenerator interface. Auchwe wrapped the call to SpringApplication.run() with *SpringApplication.exit()*. 

Beim Beenden lautet der Beendigungscode nun 42.

3.2. ExitCodeExceptionMapper

Lassen Sie uns nun herausfinden, wie wirreturn an exit code based on a runtime exception können. Dazu implementieren wir einCommandLineRunner , das immer einNumberFormatException auslöst, und registrieren dann eine Bean vom TypExitCodeExceptionMapper:

@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;
    };
}

Innerhalb vonExitCodeExceptionMapper,  ordnen wir die Ausnahme einfach einem bestimmten Exit-Code zu.

3.3. ExitCodeEvent

Als nächstes erfassen wirExitCodeEvent, um den Exit-Code unserer Anwendung zu lesen. Dazu haben wir einfachregister an event listener which subscribes to*ExitCodeEvents* (DemoListener in diesem Beispiel geschnappt:

@Bean
DemoListener demoListenerBean() {
    return new DemoListener();
}

private static class DemoListener {
    @EventListener
    public void exitEvent(ExitCodeEvent event) {
        System.out.println("Exit code: " + event.getExitCode());
    }
}

Wenn die Anwendung beendet wird, wird die MethodeexitEvent() aufgerufen und wir können den Exit-Code aus dem Ereignis lesen.

4. Fazit

In diesem Artikel haben wir mehrere von Spring Boot bereitgestellte Optionen für die Arbeit mit Exit-Codes durchgearbeitet.

Es ist sehr wichtig, dass jede Anwendung beim Beenden den richtigen Fehlercode zurückgibt. Der Exit-Code bestimmt den Status der Anwendung zum Zeitpunkt des Exits. Darüber hinaus hilft es bei der Fehlerbehebung.

Codebeispiele finden Sie inover on GitHub.