From a518707c7eafe9eaf9ff5013f6f2199db0c8ce75 Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Tue, 14 Nov 2023 10:16:57 +0100 Subject: [PATCH] GH-371 - Disable waiting for termination defaulting on Spring Framework 6.1. We now skip the defaulting to wait of the pool shutdown termination on Spring Framework 6.1, as on that, pools implement Lifecycle and we need to wait for complete shutdown during Lifecycle.stop() already and setting the flag would delay that wait to the actual destruction phase. --- .../EventPublicationAutoConfiguration.java | 9 ++++++++ ...tionAutoConfigurationIntegrationTests.java | 22 +++++++++---------- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/spring-modulith-events/spring-modulith-events-core/src/main/java/org/springframework/modulith/events/config/EventPublicationAutoConfiguration.java b/spring-modulith-events/spring-modulith-events-core/src/main/java/org/springframework/modulith/events/config/EventPublicationAutoConfiguration.java index 587d34d2..cb602b28 100644 --- a/spring-modulith-events/spring-modulith-events-core/src/main/java/org/springframework/modulith/events/config/EventPublicationAutoConfiguration.java +++ b/spring-modulith-events/spring-modulith-events-core/src/main/java/org/springframework/modulith/events/config/EventPublicationAutoConfiguration.java @@ -32,6 +32,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.task.TaskExecutionProperties; import org.springframework.boot.autoconfigure.task.TaskExecutionProperties.Shutdown; +import org.springframework.context.Lifecycle; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Import; import org.springframework.context.annotation.Role; @@ -44,6 +45,7 @@ import org.springframework.modulith.events.support.CompletionRegisteringAdvisor; import org.springframework.modulith.events.support.PersistentApplicationEventMulticaster; import org.springframework.scheduling.annotation.AbstractAsyncConfiguration; import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; /** * Fundamental configuration for the {@link EventPublicationRegistry} support. @@ -100,6 +102,9 @@ public class EventPublicationAutoConfiguration extends EventPublicationConfigura private static final Logger LOGGER = LoggerFactory.getLogger(AsyncPropertiesDefaulter.class); private static final String PROPERTY = "spring.task.execution.shutdown.await-termination"; + private static final boolean IS_SPRING_6_1_OR_BETTER = Lifecycle.class + .isAssignableFrom(ThreadPoolTaskExecutor.class); + private final Environment environment; AsyncPropertiesDefaulter(Environment environment) { @@ -114,6 +119,10 @@ public class EventPublicationAutoConfiguration extends EventPublicationConfigura @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + if (IS_SPRING_6_1_OR_BETTER) { + return bean; + } + if (!(bean instanceof TaskExecutionProperties p)) { return bean; } diff --git a/spring-modulith-events/spring-modulith-events-core/src/test/java/org/springframework/modulith/events/config/EventPublicationAutoConfigurationIntegrationTests.java b/spring-modulith-events/spring-modulith-events-core/src/test/java/org/springframework/modulith/events/config/EventPublicationAutoConfigurationIntegrationTests.java index 71fa2e86..a102e16e 100644 --- a/spring-modulith-events/spring-modulith-events-core/src/test/java/org/springframework/modulith/events/config/EventPublicationAutoConfigurationIntegrationTests.java +++ b/spring-modulith-events/spring-modulith-events-core/src/test/java/org/springframework/modulith/events/config/EventPublicationAutoConfigurationIntegrationTests.java @@ -35,6 +35,7 @@ import org.springframework.boot.test.context.assertj.AssertableApplicationContex import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.boot.test.context.runner.ContextConsumer; import org.springframework.context.annotation.AdviceMode; +import org.springframework.lang.Nullable; import org.springframework.modulith.events.CompletedEventPublications; import org.springframework.modulith.events.IncompleteEventPublications; import org.springframework.modulith.events.config.EventPublicationAutoConfiguration.AsyncPropertiesDefaulter; @@ -55,17 +56,16 @@ class EventPublicationAutoConfigurationIntegrationTests { @Mock EventPublicationRepository repository; - @Test // GH-149 - void registersAsyncTerminationDefaulterByDefault() { + @Test // GH-149, GH-371 + void doesNotRegisterAsyncTerminationDefaulterByDefault() { - basicSetup() - .run(context -> { - assertThat(context).hasSingleBean(AsyncPropertiesDefaulter.class); + basicSetup().run(context -> { - expect(Shutdown::isAwaitTermination, true).andThen( - expect(Shutdown::getAwaitTerminationPeriod, Duration.ofSeconds(2))) - .accept(context); - }); + assertThat(context).hasSingleBean(AsyncPropertiesDefaulter.class); + + expect(Shutdown::isAwaitTermination, false); + expect(Shutdown::getAwaitTerminationPeriod, null); + }); } @Test // GH-149 @@ -137,8 +137,8 @@ class EventPublicationAutoConfigurationIntegrationTests { }); } - private ContextConsumer expect(Function extractor, - T expected) { + private static ContextConsumer expect(Function extractor, + @Nullable T expected) { return context -> assertThat(context.getBean(TaskExecutionProperties.class).getShutdown()) .extracting(extractor)