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)