From: Kai Moritz Date: Mon, 11 Apr 2022 08:51:01 +0000 (+0200) Subject: Die Spring-Boot App wird nun sauber herunter gefahren X-Git-Tag: deserialization-synchroner-test~9 X-Git-Url: http://juplo.de/gitweb/?a=commitdiff_plain;h=7cf65b5089d103542849e4ca12b6f6df6ad79aa0;p=demos%2Fkafka%2Ftraining Die Spring-Boot App wird nun sauber herunter gefahren * Zuvor wurde die App nicht richtig beendet, weil der ExecutorService nicht beendet wurde und sich die JVM deswegen nicht beenden konnte. * Dies ist erst durch die Aktivierung des shutdown-Endpoints aufgefallen. * Jetzt wurde in `Application` eine `@PreDestroy`-Methode ergänzt, die den ExecutorService nach allen Regeln der Kunst ordentlich beendet. --- diff --git a/src/main/java/de/juplo/kafka/Application.java b/src/main/java/de/juplo/kafka/Application.java index f227bbe..6601e6d 100644 --- a/src/main/java/de/juplo/kafka/Application.java +++ b/src/main/java/de/juplo/kafka/Application.java @@ -7,6 +7,11 @@ import org.springframework.boot.ApplicationRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import javax.annotation.PreDestroy; +import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.TimeUnit; + @SpringBootApplication @Slf4j @@ -14,6 +19,8 @@ public class Application implements ApplicationRunner { @Autowired EndlessConsumer endlessConsumer; + @Autowired + ExecutorService executor; @Override @@ -23,6 +30,33 @@ public class Application implements ApplicationRunner endlessConsumer.start(); } + @PreDestroy + public void stopExecutor() + { + try + { + log.info("Shutting down the ExecutorService."); + executor.shutdown(); + log.info("Waiting 5 seconds for the ExecutorService to terminate..."); + executor.awaitTermination(5, TimeUnit.SECONDS); + } + catch (InterruptedException e) + { + log.error("Exception while waiting for the termination of the ExecutorService: {}", e.toString()); + } + finally + { + if (!executor.isShutdown()) + { + log.warn("Forcing shutdown of ExecutorService!"); + executor + .shutdownNow() + .forEach(runnable -> log.warn("Unfinished task: {}", runnable.getClass().getSimpleName())); + } + log.info("Shutdow of ExecutorService finished"); + } + } + public static void main(String[] args) {