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:
@@ -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>
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 {}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user