From b834c255ec65ac4de19bdba249f3dfebda9b01b5 Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Thu, 23 Mar 2023 11:29:54 +0100 Subject: [PATCH] GH-184 - Enable asynchronous support when using event publication registry. Unless manually configured we now configure @EnableAsync by default in the event publication registry module. --- .../spring-modulith-events-core/pom.xml | 6 +++++ .../config/EventPublicationConfiguration.java | 12 +++++++++ ...licationConfigurationIntegrationTests.java | 27 +++++++++++++++++++ 3 files changed, 45 insertions(+) diff --git a/spring-modulith-events/spring-modulith-events-core/pom.xml b/spring-modulith-events/spring-modulith-events-core/pom.xml index b7cdad20..0eb2022c 100644 --- a/spring-modulith-events/spring-modulith-events-core/pom.xml +++ b/spring-modulith-events/spring-modulith-events-core/pom.xml @@ -46,6 +46,12 @@ test + + org.springframework + spring-aspects + test + + org.springframework.boot spring-boot-test-autoconfigure diff --git a/spring-modulith-events/spring-modulith-events-core/src/main/java/org/springframework/modulith/events/config/EventPublicationConfiguration.java b/spring-modulith-events/spring-modulith-events-core/src/main/java/org/springframework/modulith/events/config/EventPublicationConfiguration.java index 543d829b..59d89f71 100644 --- a/spring-modulith-events/spring-modulith-events-core/src/main/java/org/springframework/modulith/events/config/EventPublicationConfiguration.java +++ b/spring-modulith-events/spring-modulith-events-core/src/main/java/org/springframework/modulith/events/config/EventPublicationConfiguration.java @@ -24,25 +24,33 @@ import org.springframework.beans.BeansException; import org.springframework.beans.factory.ObjectFactory; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanPostProcessor; +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.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; import org.springframework.context.annotation.Role; import org.springframework.core.env.Environment; import org.springframework.modulith.events.DefaultEventPublicationRegistry; import org.springframework.modulith.events.EventPublicationRegistry; import org.springframework.modulith.events.EventPublicationRepository; +import org.springframework.modulith.events.config.EventPublicationConfiguration.AsyncEnablingConfiguration; 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; /** + * Fundamental configuration for the {@link EventPublicationRegistry} support. + * * @author Oliver Drotbohm * @author Björn Kieling * @author Dmitry Belyaev */ @Configuration(proxyBeanMethods = false) +@Import(AsyncEnablingConfiguration.class) class EventPublicationConfiguration { @Bean @@ -74,6 +82,10 @@ class EventPublicationConfiguration { return new AsyncPropertiesDefaulter(environment); } + @EnableAsync + @ConditionalOnMissingBean(AbstractAsyncConfiguration.class) + static class AsyncEnablingConfiguration {} + static class AsyncPropertiesDefaulter implements BeanPostProcessor { private static final Logger LOGGER = LoggerFactory.getLogger(AsyncPropertiesDefaulter.class); diff --git a/spring-modulith-events/spring-modulith-events-core/src/test/java/org/springframework/modulith/events/config/EventPublicationConfigurationIntegrationTests.java b/spring-modulith-events/spring-modulith-events-core/src/test/java/org/springframework/modulith/events/config/EventPublicationConfigurationIntegrationTests.java index e17c76db..8bcf001e 100644 --- a/spring-modulith-events/spring-modulith-events-core/src/test/java/org/springframework/modulith/events/config/EventPublicationConfigurationIntegrationTests.java +++ b/spring-modulith-events/spring-modulith-events-core/src/test/java/org/springframework/modulith/events/config/EventPublicationConfigurationIntegrationTests.java @@ -31,8 +31,12 @@ import org.springframework.boot.autoconfigure.task.TaskExecutionProperties.Shutd import org.springframework.boot.test.context.assertj.AssertableApplicationContext; 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.modulith.events.EventPublicationRepository; import org.springframework.modulith.events.config.EventPublicationConfiguration.AsyncPropertiesDefaulter; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.ProxyAsyncConfiguration; +import org.springframework.scheduling.aspectj.AspectJAsyncConfiguration; /** * Unit tests for {@link EventPublicationConfiguration}. @@ -81,6 +85,26 @@ class EventPublicationConfigurationIntegrationTests { .run(expect(Shutdown::getAwaitTerminationPeriod, Duration.ofMinutes(10))); } + @Test // GH-184 + void enablesAsyncSupportByDefault() { + + basicSetup().run(context -> { + assertThat(context).hasSingleBean(ProxyAsyncConfiguration.class); + }); + } + + @Test // GH-184 + void doesNotEnableAsyncSupportByDefaultIfExplicitlyConfigured() { + + basicSetup() + .withUserConfiguration(CustomAsyncConfiguration.class) + .run(context -> { + assertThat(context) + .doesNotHaveBean(ProxyAsyncConfiguration.class) + .hasSingleBean(AspectJAsyncConfiguration.class); + }); + } + private ContextConsumer expect(Function extractor, T expected) { @@ -96,4 +120,7 @@ class EventPublicationConfigurationIntegrationTests { AutoConfigurations.of(EventPublicationConfiguration.class, TaskExecutionAutoConfiguration.class)) .withBean(EventPublicationRepository.class, () -> repository); } + + @EnableAsync(mode = AdviceMode.ASPECTJ) + static class CustomAsyncConfiguration {} }