From 28b7c583a9944e98046133fdc353a44d86f7580c Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Tue, 18 Apr 2023 18:19:07 +0100 Subject: [PATCH] Ensure shutdown hook is registered when a handler is added Closes gh-34627 --- .../boot/SpringApplicationShutdownHook.java | 1 + .../boot/SpringApplicationShutdownHookTests.java | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/SpringApplicationShutdownHook.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/SpringApplicationShutdownHook.java index 72576db04f..afa1ea89e9 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/SpringApplicationShutdownHook.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/SpringApplicationShutdownHook.java @@ -170,6 +170,7 @@ class SpringApplicationShutdownHook implements Runnable { @Override public void add(Runnable action) { Assert.notNull(action, "Action must not be null"); + addRuntimeShutdownHookIfNecessary(); synchronized (SpringApplicationShutdownHook.class) { assertNotInProgress(); this.actions.add(action); diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationShutdownHookTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationShutdownHookTests.java index 133f5acab8..c8cf5b1ffb 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationShutdownHookTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationShutdownHookTests.java @@ -57,6 +57,15 @@ class SpringApplicationShutdownHookTests { assertThat(shutdownHook.isRuntimeShutdownHookAdded()).isTrue(); } + @Test + void shutdownHookIsNotAddedUntilHandlerIsRegistered() { + TestSpringApplicationShutdownHook shutdownHook = new TestSpringApplicationShutdownHook(); + assertThat(shutdownHook.isRuntimeShutdownHookAdded()).isFalse(); + shutdownHook.getHandlers().add(() -> { + }); + assertThat(shutdownHook.isRuntimeShutdownHookAdded()).isTrue(); + } + @Test void runClosesContextsBeforeRunningHandlerActions() { TestSpringApplicationShutdownHook shutdownHook = new TestSpringApplicationShutdownHook();