Spring Shutdown Callbacks

Rückrufe beim Herunterfahren im Frühjahr

1. Überblick

In diesem Tutorial lernen wir verschiedene Methodento use shutdown callbacks with Spring.

Der Hauptvorteil der Verwendung eines Shutdown-Rückrufs besteht darin, dass wir die Kontrolle über einen ordnungsgemäßen Anwendungs-Exit haben.

2. Callback-Ansätze zum Herunterfahren

Spring unterstützt sowohl Shutdown-Callbacks auf Komponentenebene als auch auf Kontextebene. Wir können diese Rückrufe erstellen mit:

  • @ PreDestroy

  • DisposableBean Schnittstelle

  • Bean-Destroy-Methode

  • GlobaleServletContextListener

Sehen wir uns all diese Ansätze anhand von Beispielen an.

2.1. Verwenden von@PreDestroy

Erstellen wir eine Bean, die@PreDestroy verwendet:

@Component
public class Bean1 {

    @PreDestroy
    public void destroy() {
        System.out.println(
          "Callback triggered - @PreDestroy.");
    }
}

Während der Bean-Initialisierung registriert Spring alle Bean-Methoden, die mit@PreDestroy versehen sind, und ruft sie auf, wenn die Anwendung heruntergefahren wird.

2.2. Verwenden derDisposableBean-Schnittstelle

Unsere zweite Bean implementiert dieDisposableBean-Schnittstelle, um den Rückruf zum Herunterfahren zu registrieren:

@Component
public class Bean2 implements DisposableBean {

    @Override
    public void destroy() throws Exception {
        System.out.println(
          "Callback triggered - DisposableBean.");
    }
}

2.3. Deklarieren einer Bean Destroy-Methode

Für diesen Ansatz erstellen wir zunächst eine Klasse mit einer benutzerdefinierten Zerstörungsmethode:

public class Bean3 {

    public void destroy() {
        System.out.println(
          "Callback triggered - bean destroy method.");
    }
}

Anschließend erstellen wir die Konfigurationsklasse, die die Bean initialisiert und ihredestroy()-Methode als unseren Rückruf zum Herunterfahren markiert:

@Configuration
public class ShutdownHookConfiguration {

    @Bean(destroyMethod = "destroy")
    public Bean3 initializeBean3() {
        return new Bean3();
    }
}

Die XML-Methode zum Registrieren der destroy-Methode lautet:

2.4. Verwenden eines globalenServletContextListener

Im Gegensatz zu den anderen drei Ansätzen, bei denen der Rückruf auf Bean-Ebene registriert wird, istthe ServletContextListener registers the callback at context level.

Dazu erstellen wir einen benutzerdefinierten Kontext-Listener:

public class ExampleServletContextListener
  implements ServletContextListener {

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        System.out.println(
          "Callback triggered - ContextListener.");
    }

    @Override
    public void contextInitialized(ServletContextEvent event) {
        // Triggers when context initializes
    }
}

Wir müssen es beiServletListenerRegistrationBean in der Konfigurationsklasse registrieren:

@Bean
ServletListenerRegistrationBean servletListener() {
    ServletListenerRegistrationBean srb
      = new ServletListenerRegistrationBean<>();
    srb.setListener(new ExampleServletContextListener());
    return srb;
}

3. Fazit

Wir haben die verschiedenen Möglichkeiten kennengelernt, die Spring bietet, um Rückrufe beim Herunterfahren sowohl auf Bean-Ebene als auch auf Kontextebene zu registrieren.

Diese können verwendet werden, um die Anwendung ordnungsgemäß herunterzufahren und die verwendeten Ressourcen effektiv freizugeben.

Wie immer finden Sie alle in diesem Artikel genannten Beispiele inover on Github.