Skip to content

Commit b834c25

Browse files
committed
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.
1 parent 29a5148 commit b834c25

File tree

3 files changed

+45
-0
lines changed

3 files changed

+45
-0
lines changed

spring-modulith-events/spring-modulith-events-core/pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,12 @@
4646
<scope>test</scope>
4747
</dependency>
4848

49+
<dependency>
50+
<groupId>org.springframework</groupId>
51+
<artifactId>spring-aspects</artifactId>
52+
<scope>test</scope>
53+
</dependency>
54+
4955
<dependency>
5056
<groupId>org.springframework.boot</groupId>
5157
<artifactId>spring-boot-test-autoconfigure</artifactId>

spring-modulith-events/spring-modulith-events-core/src/main/java/org/springframework/modulith/events/config/EventPublicationConfiguration.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,25 +24,33 @@
2424
import org.springframework.beans.factory.ObjectFactory;
2525
import org.springframework.beans.factory.config.BeanDefinition;
2626
import org.springframework.beans.factory.config.BeanPostProcessor;
27+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2728
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
2829
import org.springframework.boot.autoconfigure.task.TaskExecutionProperties;
2930
import org.springframework.boot.autoconfigure.task.TaskExecutionProperties.Shutdown;
3031
import org.springframework.context.annotation.Bean;
3132
import org.springframework.context.annotation.Configuration;
33+
import org.springframework.context.annotation.Import;
3234
import org.springframework.context.annotation.Role;
3335
import org.springframework.core.env.Environment;
3436
import org.springframework.modulith.events.DefaultEventPublicationRegistry;
3537
import org.springframework.modulith.events.EventPublicationRegistry;
3638
import org.springframework.modulith.events.EventPublicationRepository;
39+
import org.springframework.modulith.events.config.EventPublicationConfiguration.AsyncEnablingConfiguration;
3740
import org.springframework.modulith.events.support.CompletionRegisteringAdvisor;
3841
import org.springframework.modulith.events.support.PersistentApplicationEventMulticaster;
42+
import org.springframework.scheduling.annotation.AbstractAsyncConfiguration;
43+
import org.springframework.scheduling.annotation.EnableAsync;
3944

4045
/**
46+
* Fundamental configuration for the {@link EventPublicationRegistry} support.
47+
*
4148
* @author Oliver Drotbohm
4249
* @author Björn Kieling
4350
* @author Dmitry Belyaev
4451
*/
4552
@Configuration(proxyBeanMethods = false)
53+
@Import(AsyncEnablingConfiguration.class)
4654
class EventPublicationConfiguration {
4755

4856
@Bean
@@ -74,6 +82,10 @@ static AsyncPropertiesDefaulter asyncPropertiesDefaulter(Environment environment
7482
return new AsyncPropertiesDefaulter(environment);
7583
}
7684

85+
@EnableAsync
86+
@ConditionalOnMissingBean(AbstractAsyncConfiguration.class)
87+
static class AsyncEnablingConfiguration {}
88+
7789
static class AsyncPropertiesDefaulter implements BeanPostProcessor {
7890

7991
private static final Logger LOGGER = LoggerFactory.getLogger(AsyncPropertiesDefaulter.class);

spring-modulith-events/spring-modulith-events-core/src/test/java/org/springframework/modulith/events/config/EventPublicationConfigurationIntegrationTests.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,12 @@
3131
import org.springframework.boot.test.context.assertj.AssertableApplicationContext;
3232
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
3333
import org.springframework.boot.test.context.runner.ContextConsumer;
34+
import org.springframework.context.annotation.AdviceMode;
3435
import org.springframework.modulith.events.EventPublicationRepository;
3536
import org.springframework.modulith.events.config.EventPublicationConfiguration.AsyncPropertiesDefaulter;
37+
import org.springframework.scheduling.annotation.EnableAsync;
38+
import org.springframework.scheduling.annotation.ProxyAsyncConfiguration;
39+
import org.springframework.scheduling.aspectj.AspectJAsyncConfiguration;
3640

3741
/**
3842
* Unit tests for {@link EventPublicationConfiguration}.
@@ -81,6 +85,26 @@ void doesNotApplyDefaultingIfShutdownTerminationPeriodPropertyConfigured() {
8185
.run(expect(Shutdown::getAwaitTerminationPeriod, Duration.ofMinutes(10)));
8286
}
8387

88+
@Test // GH-184
89+
void enablesAsyncSupportByDefault() {
90+
91+
basicSetup().run(context -> {
92+
assertThat(context).hasSingleBean(ProxyAsyncConfiguration.class);
93+
});
94+
}
95+
96+
@Test // GH-184
97+
void doesNotEnableAsyncSupportByDefaultIfExplicitlyConfigured() {
98+
99+
basicSetup()
100+
.withUserConfiguration(CustomAsyncConfiguration.class)
101+
.run(context -> {
102+
assertThat(context)
103+
.doesNotHaveBean(ProxyAsyncConfiguration.class)
104+
.hasSingleBean(AspectJAsyncConfiguration.class);
105+
});
106+
}
107+
84108
private <T> ContextConsumer<AssertableApplicationContext> expect(Function<Shutdown, T> extractor,
85109
T expected) {
86110

@@ -96,4 +120,7 @@ private ApplicationContextRunner basicSetup() {
96120
AutoConfigurations.of(EventPublicationConfiguration.class, TaskExecutionAutoConfiguration.class))
97121
.withBean(EventPublicationRepository.class, () -> repository);
98122
}
123+
124+
@EnableAsync(mode = AdviceMode.ASPECTJ)
125+
static class CustomAsyncConfiguration {}
99126
}

0 commit comments

Comments
 (0)