Move the transaction manager configuration to AbstractTaskletStepBuilder

Before this commit, the transaction manager was configurable
at the StepBuilder level, which is inconsistent with the XML
config style in addition to be not needed for most step types.

This commit moves the configuration of the transaction manager
from the StepBuilder down to the AbstractTaskletStepBuilder,
which is the level where the transaction manager is needed.

Resolves #4130
This commit is contained in:
Mahmoud Ben Hassine
2022-09-02 10:35:02 +02:00
parent 55af86df59
commit 7c8fb172a7
46 changed files with 409 additions and 195 deletions

View File

@@ -35,6 +35,7 @@ import org.springframework.context.annotation.AnnotationConfigApplicationContext
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.support.JdbcTransactionManager;
import org.springframework.lang.Nullable;
import java.util.HashSet;
@@ -92,7 +93,7 @@ class JobLauncherTestUtilsTests {
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
return null;
}
}).build();
}).transactionManager(transactionManager(dataSource())).build();
}
@Bean
@@ -114,6 +115,11 @@ class JobLauncherTestUtilsTests {
.addScript("/org/springframework/batch/core/schema-hsqldb.sql").generateUniqueName(true).build();
}
@Bean
public JdbcTransactionManager transactionManager(DataSource dataSource) {
return new JdbcTransactionManager(dataSource);
}
}
}

View File

@@ -42,6 +42,7 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
import org.springframework.jdbc.support.JdbcTransactionManager;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
@@ -130,6 +131,11 @@ public class SpringBatchTestJUnit4Tests {
.addScript("/org/springframework/batch/core/schema-hsqldb.sql").build();
}
@Bean
public JdbcTransactionManager transactionManager(DataSource dataSource) {
return new JdbcTransactionManager(dataSource);
}
@Bean
@StepScope
public ItemReader<String> stepScopedItemReader(@Value("#{stepExecutionContext['input.data']}") String data) {
@@ -144,8 +150,11 @@ public class SpringBatchTestJUnit4Tests {
@Bean
public Job job() {
return this.jobBuilderFactory.get("job").start(this.stepBuilderFactory.get("step")
.tasklet((contribution, chunkContext) -> RepeatStatus.FINISHED).build()).build();
return this.jobBuilderFactory.get("job")
.start(this.stepBuilderFactory.get("step")
.tasklet((contribution, chunkContext) -> RepeatStatus.FINISHED)
.transactionManager(transactionManager(dataSource())).build())
.build();
}
}

View File

@@ -43,6 +43,7 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
import org.springframework.jdbc.support.JdbcTransactionManager;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -124,6 +125,11 @@ public class SpringBatchTestJUnit5Tests {
.addScript("/org/springframework/batch/core/schema-hsqldb.sql").build();
}
@Bean
public JdbcTransactionManager transactionManager(DataSource dataSource) {
return new JdbcTransactionManager(dataSource);
}
@Bean
@StepScope
public ItemReader<String> stepScopedItemReader(@Value("#{stepExecutionContext['input.data']}") String data) {
@@ -138,8 +144,10 @@ public class SpringBatchTestJUnit5Tests {
@Bean
public Job job(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory) {
return jobBuilderFactory.get("job").start(stepBuilderFactory.get("step")
.tasklet((contribution, chunkContext) -> RepeatStatus.FINISHED).build()).build();
return jobBuilderFactory.get("job")
.start(stepBuilderFactory.get("step").tasklet((contribution, chunkContext) -> RepeatStatus.FINISHED)
.transactionManager(transactionManager(dataSource())).build())
.build();
}
}

View File

@@ -43,8 +43,10 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
import org.springframework.jdbc.support.JdbcTransactionManager;
import org.springframework.lang.Nullable;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
import org.springframework.transaction.PlatformTransactionManager;
@SpringJUnitConfig
class StepScopeAnnotatedListenerIntegrationTests {
@@ -103,6 +105,9 @@ class StepScopeAnnotatedListenerIntegrationTests {
@Autowired
private StepBuilderFactory stepBuilder;
@Autowired
private PlatformTransactionManager transactionManager;
@Bean
JobLauncherTestUtils jobLauncherTestUtils() {
return new JobLauncherTestUtils();
@@ -116,6 +121,11 @@ class StepScopeAnnotatedListenerIntegrationTests {
.setType(EmbeddedDatabaseType.HSQL).build();
}
@Bean
public JdbcTransactionManager transactionManager(DataSource dataSource) {
return new JdbcTransactionManager(dataSource);
}
@Bean
public Job jobUnderTest() {
return jobBuilder.get("job-under-test").start(stepUnderTest()).build();
@@ -123,7 +133,8 @@ class StepScopeAnnotatedListenerIntegrationTests {
@Bean
public Step stepUnderTest() {
return stepBuilder.get("step-under-test").<String, String>chunk(1).reader(reader()).processor(processor())
return stepBuilder.get("step-under-test").<String, String>chunk(1)
.transactionManager(this.transactionManager).reader(reader()).processor(processor())
.writer(writer()).build();
}