mirror of
https://github.com/spring-projects/spring-boot.git
synced 2026-09-17 12:09:16 +00:00
Align use of transaction manager in MongoDB support
See gh-51725 Signed-off-by: Yanming Zhou <zhouyanming@gmail.com>
This commit is contained in:
committed by
Stéphane Nicoll
parent
683d41b323
commit
f5b8c5a72d
+6
-4
@@ -49,12 +49,14 @@ import org.springframework.data.mongodb.MongoTransactionManager;
|
||||
import org.springframework.data.mongodb.core.MongoOperations;
|
||||
import org.springframework.data.mongodb.core.MongoTemplate;
|
||||
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
|
||||
import org.springframework.transaction.PlatformTransactionManager;
|
||||
import org.springframework.transaction.annotation.Isolation;
|
||||
|
||||
/**
|
||||
* {@link EnableAutoConfiguration Auto-configuration} for Spring Batch using Data MongoDB.
|
||||
*
|
||||
* @author Stephane Nicoll
|
||||
* @author Yanming Zhou
|
||||
* @since 4.1.0
|
||||
*/
|
||||
@AutoConfiguration(before = { BatchAutoConfiguration.class, BatchJobLauncherAutoConfiguration.class },
|
||||
@@ -93,15 +95,15 @@ public final class BatchDataMongoAutoConfiguration {
|
||||
|
||||
private final MongoOperations mongoOperations;
|
||||
|
||||
private final MongoTransactionManager transactionManager;
|
||||
private final PlatformTransactionManager transactionManager;
|
||||
|
||||
private final @Nullable TaskExecutor taskExecutor;
|
||||
|
||||
private final BatchDataMongoProperties properties;
|
||||
|
||||
SpringBootBatchMongoConfiguration(MongoDatabaseFactory mongoDatabaseFactory,
|
||||
ObjectProvider<MongoTransactionManager> transactionManager,
|
||||
@BatchTransactionManager ObjectProvider<MongoTransactionManager> batchTransactionManager,
|
||||
ObjectProvider<PlatformTransactionManager> transactionManager,
|
||||
@BatchTransactionManager ObjectProvider<PlatformTransactionManager> batchTransactionManager,
|
||||
@BatchTaskExecutor ObjectProvider<TaskExecutor> batchTaskExecutor,
|
||||
BatchDataMongoProperties properties) {
|
||||
this.mongoOperations = createMongoOperations(mongoDatabaseFactory);
|
||||
@@ -124,7 +126,7 @@ public final class BatchDataMongoAutoConfiguration {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected MongoTransactionManager getTransactionManager() {
|
||||
protected PlatformTransactionManager getTransactionManager() {
|
||||
return this.transactionManager;
|
||||
}
|
||||
|
||||
|
||||
+43
-6
@@ -37,6 +37,7 @@ import org.springframework.data.mongodb.MongoDatabaseFactory;
|
||||
import org.springframework.data.mongodb.MongoTransactionManager;
|
||||
import org.springframework.data.mongodb.core.MongoExceptionTranslator;
|
||||
import org.springframework.data.mongodb.core.MongoOperations;
|
||||
import org.springframework.transaction.PlatformTransactionManager;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.mockito.ArgumentMatchers.anyString;
|
||||
@@ -49,6 +50,7 @@ import static org.mockito.Mockito.times;
|
||||
* Tests for {@link BatchDataMongoAutoConfiguration}.
|
||||
*
|
||||
* @author Stephane Nicoll
|
||||
* @author Yanming Zhou
|
||||
*/
|
||||
class BatchDataMongoAutoConfigurationTests {
|
||||
|
||||
@@ -69,7 +71,7 @@ class BatchDataMongoAutoConfigurationTests {
|
||||
}
|
||||
|
||||
@Test
|
||||
void autConfigurationUsesMainTransactionManager() {
|
||||
void autConfigurationUsesMainMongoTransactionManager() {
|
||||
MongoTransactionManager transactionManager = mock(MongoTransactionManager.class);
|
||||
this.contextRunner.withBean(MongoDatabaseFactory.class, this::mockMongoDatabaseFactory)
|
||||
.withBean(MongoTransactionManager.class, () -> transactionManager)
|
||||
@@ -79,11 +81,21 @@ class BatchDataMongoAutoConfigurationTests {
|
||||
}
|
||||
|
||||
@Test
|
||||
void autConfigurationFavorsBatchTransactionManager() {
|
||||
void autConfigurationUsesMainPlatformTransactionManager() {
|
||||
PlatformTransactionManager transactionManager = mock(PlatformTransactionManager.class);
|
||||
this.contextRunner.withBean(MongoDatabaseFactory.class, this::mockMongoDatabaseFactory)
|
||||
.withBean(PlatformTransactionManager.class, () -> transactionManager)
|
||||
.run((context) -> assertThat(
|
||||
context.getBean(SpringBootBatchMongoConfiguration.class).getTransactionManager())
|
||||
.isSameAs(transactionManager));
|
||||
}
|
||||
|
||||
@Test
|
||||
void autConfigurationFavorsBatchMongoTransactionManager() {
|
||||
MongoTransactionManager transactionManager = mock(MongoTransactionManager.class);
|
||||
this.contextRunner.withBean(MongoDatabaseFactory.class, this::mockMongoDatabaseFactory)
|
||||
.withBean(MongoTransactionManager.class, () -> transactionManager)
|
||||
.withUserConfiguration(BatchTransactionManagerConfiguration.class)
|
||||
.withUserConfiguration(BatchMongoTransactionManagerConfiguration.class)
|
||||
.run((context) -> {
|
||||
assertThat(context.getBeansOfType(MongoTransactionManager.class)).hasSize(2);
|
||||
assertThat(context.getBean(SpringBootBatchMongoConfiguration.class).getTransactionManager())
|
||||
@@ -91,14 +103,28 @@ class BatchDataMongoAutoConfigurationTests {
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void autConfigurationFavorsBatchPlatformTransactionManager() {
|
||||
PlatformTransactionManager transactionManager = mock(PlatformTransactionManager.class);
|
||||
this.contextRunner.withBean(MongoDatabaseFactory.class, this::mockMongoDatabaseFactory)
|
||||
.withBean(PlatformTransactionManager.class, () -> transactionManager)
|
||||
.withUserConfiguration(BatchPlatformTransactionManagerConfiguration.class)
|
||||
.run((context) -> {
|
||||
assertThat(context.getBeansOfType(PlatformTransactionManager.class)).hasSize(2);
|
||||
assertThat(context.getBean(SpringBootBatchMongoConfiguration.class).getTransactionManager())
|
||||
.isSameAs(context.getBean("customTransactionManager"));
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void autConfigurationCreatesBatchTransactionManagerIfNecessary() {
|
||||
MongoDatabaseFactory mongoDatabaseFactory = mockMongoDatabaseFactory();
|
||||
this.contextRunner.withBean(MongoDatabaseFactory.class, () -> mongoDatabaseFactory).run((context) -> {
|
||||
assertThat(context).doesNotHaveBean(MongoTransactionManager.class);
|
||||
assertThat(context.getBean(SpringBootBatchMongoConfiguration.class).getTransactionManager())
|
||||
.satisfies((mongoTransactionManager) -> assertThat(mongoTransactionManager.getDatabaseFactory())
|
||||
.isSameAs(mongoDatabaseFactory));
|
||||
.isInstanceOfSatisfying(MongoTransactionManager.class,
|
||||
(mongoTransactionManager) -> assertThat(mongoTransactionManager.getDatabaseFactory())
|
||||
.isSameAs(mongoDatabaseFactory));
|
||||
});
|
||||
}
|
||||
|
||||
@@ -197,7 +223,7 @@ class BatchDataMongoAutoConfigurationTests {
|
||||
}
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
static class BatchTransactionManagerConfiguration {
|
||||
static class BatchMongoTransactionManagerConfiguration {
|
||||
|
||||
@Bean
|
||||
@BatchTransactionManager
|
||||
@@ -207,4 +233,15 @@ class BatchDataMongoAutoConfigurationTests {
|
||||
|
||||
}
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
static class BatchPlatformTransactionManagerConfiguration {
|
||||
|
||||
@Bean
|
||||
@BatchTransactionManager
|
||||
PlatformTransactionManager customTransactionManager() {
|
||||
return mock(PlatformTransactionManager.class);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user