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.
This commit is contained in:
Oliver Drotbohm
2023-03-23 11:29:54 +01:00
parent 29a5148dcb
commit b834c255ec
3 changed files with 45 additions and 0 deletions

View File

@@ -46,6 +46,12 @@
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test-autoconfigure</artifactId>

View File

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

View File

@@ -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 <T> ContextConsumer<AssertableApplicationContext> expect(Function<Shutdown, T> 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 {}
}