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.
This commit is contained in:
Oliver Drotbohm
2023-11-14 10:16:57 +01:00
parent 3692a209d7
commit a518707c7e
2 changed files with 20 additions and 11 deletions

View File

@@ -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;
}

View File

@@ -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 <T> ContextConsumer<AssertableApplicationContext> expect(Function<Shutdown, T> extractor,
T expected) {
private static <T> ContextConsumer<AssertableApplicationContext> expect(Function<Shutdown, T> extractor,
@Nullable T expected) {
return context -> assertThat(context.getBean(TaskExecutionProperties.class).getShutdown())
.extracting(extractor)