From 646722beafc6cdbd6331b3a9e7a1331251baa4eb Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Mon, 1 May 2023 21:18:23 +0200 Subject: [PATCH] GH-175 - Auto-configure transactions for MongoDB by default. As the Event Publication registry only works in transactional environments, we should enable them for MongoDB by default. This will require a replica setup for the MongoDB instance the application interacts with. --- .../MongoDbTransactionAutoConfiguration.java | 49 +++++++++++++++++++ ...ot.autoconfigure.AutoConfiguration.imports | 1 + ...tionAutoConfigurationIntegrationTests.java | 4 +- src/docs/asciidoc/40-events.adoc | 5 +- 4 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 spring-modulith-events/spring-modulith-events-mongodb/src/main/java/org/springframework/modulith/events/mongodb/MongoDbTransactionAutoConfiguration.java diff --git a/spring-modulith-events/spring-modulith-events-mongodb/src/main/java/org/springframework/modulith/events/mongodb/MongoDbTransactionAutoConfiguration.java b/spring-modulith-events/spring-modulith-events-mongodb/src/main/java/org/springframework/modulith/events/mongodb/MongoDbTransactionAutoConfiguration.java new file mode 100644 index 00000000..4f7b3ea0 --- /dev/null +++ b/spring-modulith-events/spring-modulith-events-mongodb/src/main/java/org/springframework/modulith/events/mongodb/MongoDbTransactionAutoConfiguration.java @@ -0,0 +1,49 @@ +/* + * Copyright 2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.modulith.events.mongodb; + +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.data.mongodb.MongoDatabaseFactory; +import org.springframework.data.mongodb.MongoTransactionManager; +import org.springframework.modulith.events.EventPublicationRegistry; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.support.TransactionTemplate; + +/** + * Auto-configuration to enable MongoDB transaction management as that is required for the + * {@link EventPublicationRegistry} to work properly. + * + * @author Oliver Drotbohm + */ +@AutoConfiguration +@ConditionalOnProperty(// + name = "spring.modulith.events.mongobd.transaction-management.enabled", + havingValue = "true", + matchIfMissing = true) +class MongoDbTransactionAutoConfiguration { + + @Bean + MongoTransactionManager transactionManager(MongoDatabaseFactory factory) { + return new MongoTransactionManager(factory); + } + + @Bean + TransactionTemplate transactionTemplate(PlatformTransactionManager txManager) { + return new TransactionTemplate(txManager); + } +} diff --git a/spring-modulith-events/spring-modulith-events-mongodb/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/spring-modulith-events/spring-modulith-events-mongodb/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 84af13fc..976532ec 100644 --- a/spring-modulith-events/spring-modulith-events-mongodb/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/spring-modulith-events/spring-modulith-events-mongodb/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1 +1,2 @@ org.springframework.modulith.events.mongodb.MongoDbEventPublicationAutoConfiguration +org.springframework.modulith.events.mongodb.MongoDbTransactionAutoConfiguration diff --git a/spring-modulith-events/spring-modulith-events-mongodb/src/test/java/org/springframework/modulith/events/mongodb/MongoDbEventPublicationAutoConfigurationIntegrationTests.java b/spring-modulith-events/spring-modulith-events-mongodb/src/test/java/org/springframework/modulith/events/mongodb/MongoDbEventPublicationAutoConfigurationIntegrationTests.java index 668146a3..7bdfb745 100644 --- a/spring-modulith-events/spring-modulith-events-mongodb/src/test/java/org/springframework/modulith/events/mongodb/MongoDbEventPublicationAutoConfigurationIntegrationTests.java +++ b/spring-modulith-events/spring-modulith-events-mongodb/src/test/java/org/springframework/modulith/events/mongodb/MongoDbEventPublicationAutoConfigurationIntegrationTests.java @@ -21,6 +21,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.ApplicationContext; +import org.springframework.data.mongodb.MongoTransactionManager; import org.springframework.modulith.events.EventPublicationRegistry; import org.springframework.modulith.testapp.TestApplication; @@ -34,10 +35,11 @@ class MongoDbEventPublicationAutoConfigurationIntegrationTests { @Autowired ApplicationContext context; - @Test // GH-4 + @Test // GH-4, GH-175 void bootstrapsApplicationComponents() { assertThat(context.getBean(EventPublicationRegistry.class)).isNotNull(); assertThat(context.getBean(MongoDbEventPublicationRepository.class)).isNotNull(); + assertThat(context.getBean(MongoTransactionManager.class)).isNotNull(); } } diff --git a/src/docs/asciidoc/40-events.adoc b/src/docs/asciidoc/40-events.adoc index aa11e46e..4b9772ec 100644 --- a/src/docs/asciidoc/40-events.adoc +++ b/src/docs/asciidoc/40-events.adoc @@ -147,8 +147,11 @@ To ease that task, Spring Modulith provides starter POMs that are centered aroun The following starters are available: * `spring-modulith-starter-jpa` -- Using JPA as persistence technology. -* `spring-modulith-starter-jdbc` -- Using JDBC as persistence technology. Also works in JPA-based applications but bypasses your JPA provider for actual event persistence. +* `spring-modulith-starter-jdbc` -- Using JDBC as persistence technology. +Also works in JPA-based applications but bypasses your JPA provider for actual event persistence. * `spring-modulith-starter-mongodb` -- Using MongoDB behind Spring Data MongoDB. +Also enables MongoDB transactions and requires a replica set setup of the server to interact with. +The transaction auto-configuration can be disabled by setting the `spring.modulith.events.mongobd.transaction-management.enabled` property to `false`. [[events.integration-testing]] == Integration Testing Application Modules Working with Events