Skip to content

Commit 8be91b2

Browse files
committed
Updates for SpringBatch v6
1 parent eddd368 commit 8be91b2

12 files changed

+84
-130
lines changed

pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@
6161
<java.test.version>17</java.test.version>
6262
<java.test.release.version>17</java.test.release.version>
6363
<junit.jupiter.version>6.0.1</junit.jupiter.version>
64-
<spring.batch.version>5.2.4</spring.batch.version>
64+
<spring.batch.version>6.0.0</spring.batch.version>
6565

6666
<checkstyle.config>checkstyle-override.xml</checkstyle.config>
6767

@@ -142,7 +142,7 @@
142142
<dependency>
143143
<groupId>org.mybatis</groupId>
144144
<artifactId>mybatis-spring</artifactId>
145-
<version>3.0.5</version>
145+
<version>4.0.0</version>
146146
<scope>test</scope>
147147
</dependency>
148148
<dependency>

src/test/java/examples/springbatch/bulkinsert/BulkInsertConfiguration.java

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,21 +21,26 @@
2121

2222
import javax.sql.DataSource;
2323

24+
import java.util.Objects;
25+
26+
import examples.springbatch.common.PersonRecord;
27+
import examples.springbatch.mapper.PersonDynamicSqlSupport;
28+
import examples.springbatch.mapper.PersonMapper;
2429
import org.apache.ibatis.session.SqlSessionFactory;
2530
import org.mybatis.dynamic.sql.insert.InsertDSL;
2631
import org.mybatis.dynamic.sql.render.RenderingStrategies;
2732
import org.mybatis.spring.SqlSessionFactoryBean;
2833
import org.mybatis.spring.annotation.MapperScan;
2934
import org.mybatis.spring.batch.MyBatisBatchItemWriter;
30-
import org.springframework.batch.core.Job;
31-
import org.springframework.batch.core.Step;
3235
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
36+
import org.springframework.batch.core.job.Job;
3337
import org.springframework.batch.core.job.builder.JobBuilder;
34-
import org.springframework.batch.core.launch.support.RunIdIncrementer;
38+
import org.springframework.batch.core.job.parameters.RunIdIncrementer;
3539
import org.springframework.batch.core.repository.JobRepository;
40+
import org.springframework.batch.core.step.Step;
3641
import org.springframework.batch.core.step.builder.StepBuilder;
37-
import org.springframework.batch.item.ItemProcessor;
38-
import org.springframework.batch.item.ItemWriter;
42+
import org.springframework.batch.infrastructure.item.ItemProcessor;
43+
import org.springframework.batch.infrastructure.item.ItemWriter;
3944
import org.springframework.beans.factory.annotation.Autowired;
4045
import org.springframework.context.annotation.Bean;
4146
import org.springframework.context.annotation.ComponentScan;
@@ -45,10 +50,6 @@
4550
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
4651
import org.springframework.transaction.PlatformTransactionManager;
4752

48-
import examples.springbatch.common.PersonRecord;
49-
import examples.springbatch.mapper.PersonDynamicSqlSupport;
50-
import examples.springbatch.mapper.PersonMapper;
51-
5253
@EnableBatchProcessing
5354
@Configuration
5455
@ComponentScan("examples.springbatch.bulkinsert")
@@ -59,9 +60,6 @@ public class BulkInsertConfiguration {
5960
@Autowired
6061
private JobRepository jobRepository;
6162

62-
@Autowired
63-
private PlatformTransactionManager transactionManager;
64-
6563
@Bean
6664
public DataSource dataSource() {
6765
return new EmbeddedDatabaseBuilder()
@@ -76,7 +74,7 @@ public DataSource dataSource() {
7674
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
7775
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
7876
sessionFactory.setDataSource(dataSource);
79-
return sessionFactory.getObject();
77+
return Objects.requireNonNull(sessionFactory.getObject());
8078
}
8179

8280
@Bean
@@ -104,7 +102,7 @@ public MyBatisBatchItemWriter<PersonRecord> writer(SqlSessionFactory sqlSessionF
104102
@Bean
105103
public Step step1(ItemProcessor<PersonRecord, PersonRecord> processor, ItemWriter<PersonRecord> writer) {
106104
return new StepBuilder("step1", jobRepository)
107-
.<PersonRecord, PersonRecord>chunk(10, transactionManager)
105+
.<PersonRecord, PersonRecord>chunk(10)
108106
.reader(new TestRecordGenerator())
109107
.processor(processor)
110108
.writer(writer)

src/test/java/examples/springbatch/bulkinsert/SpringBatchBulkInsertTest.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,29 +18,28 @@
1818
import static examples.springbatch.mapper.PersonDynamicSqlSupport.*;
1919
import static org.assertj.core.api.Assertions.assertThat;
2020

21+
import examples.springbatch.mapper.PersonMapper;
2122
import org.apache.ibatis.session.SqlSession;
2223
import org.apache.ibatis.session.SqlSessionFactory;
2324
import org.junit.jupiter.api.Test;
2425
import org.mybatis.dynamic.sql.render.RenderingStrategies;
2526
import org.mybatis.dynamic.sql.select.CountDSL;
2627
import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
2728
import org.springframework.batch.core.ExitStatus;
28-
import org.springframework.batch.core.JobExecution;
29-
import org.springframework.batch.core.StepExecution;
30-
import org.springframework.batch.item.ExecutionContext;
31-
import org.springframework.batch.test.JobLauncherTestUtils;
29+
import org.springframework.batch.core.job.JobExecution;
30+
import org.springframework.batch.core.step.StepExecution;
31+
import org.springframework.batch.infrastructure.item.ExecutionContext;
32+
import org.springframework.batch.test.JobOperatorTestUtils;
3233
import org.springframework.batch.test.context.SpringBatchTest;
3334
import org.springframework.beans.factory.annotation.Autowired;
3435
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
3536

36-
import examples.springbatch.mapper.PersonMapper;
37-
3837
@SpringBatchTest
3938
@SpringJUnitConfig(classes = BulkInsertConfiguration.class)
4039
class SpringBatchBulkInsertTest {
4140

4241
@Autowired
43-
private JobLauncherTestUtils jobLauncherTestUtils;
42+
private JobOperatorTestUtils jobOperatorTestUtils;
4443

4544
@Autowired
4645
private SqlSessionFactory sqlSessionFactory;
@@ -50,7 +49,7 @@ void testThatRowsAreInserted() throws Exception {
5049
// starting condition
5150
assertThat(rowCount()).isZero();
5251

53-
JobExecution execution = jobLauncherTestUtils.launchJob();
52+
JobExecution execution = jobOperatorTestUtils.startJob();
5453
assertThat(execution.getExitStatus()).isEqualTo(ExitStatus.COMPLETED);
5554
assertThat(numberOfRowsProcessed(execution)).isEqualTo(TestRecordGenerator.recordCount());
5655

src/test/java/examples/springbatch/bulkinsert/TestRecordGenerator.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,25 +15,25 @@
1515
*/
1616
package examples.springbatch.bulkinsert;
1717

18-
import org.springframework.batch.item.ItemReader;
19-
2018
import examples.springbatch.common.PersonRecord;
19+
import org.jspecify.annotations.Nullable;
20+
import org.springframework.batch.infrastructure.item.ItemReader;
2121

2222
public class TestRecordGenerator implements ItemReader<PersonRecord> {
2323

2424
private int index = 0;
2525

2626
private static final PersonRecord[] testRecords = {
27-
new PersonRecord("Fred", "Flintstone"),
28-
new PersonRecord("Wilma", "Flintstone"),
29-
new PersonRecord("Pebbles", "Flintstone"),
30-
new PersonRecord("Barney", "Rubble"),
31-
new PersonRecord("Betty", "Rubble"),
32-
new PersonRecord("Bamm Bamm", "Rubble")
27+
new PersonRecord(null, "Fred", "Flintstone"),
28+
new PersonRecord(null, "Wilma", "Flintstone"),
29+
new PersonRecord(null, "Pebbles", "Flintstone"),
30+
new PersonRecord(null, "Barney", "Rubble"),
31+
new PersonRecord(null, "Betty", "Rubble"),
32+
new PersonRecord(null, "Bamm Bamm", "Rubble")
3333
};
3434

3535
@Override
36-
public PersonRecord read() {
36+
public @Nullable PersonRecord read() {
3737
if (index < testRecords.length) {
3838
return (testRecords[index++]);
3939
} else {

src/test/java/examples/springbatch/common/PersonProcessor.java

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@
1515
*/
1616
package examples.springbatch.common;
1717

18-
import org.springframework.batch.core.StepExecution;
1918
import org.springframework.batch.core.annotation.BeforeChunk;
2019
import org.springframework.batch.core.annotation.BeforeStep;
21-
import org.springframework.batch.core.scope.context.ChunkContext;
22-
import org.springframework.batch.item.ExecutionContext;
23-
import org.springframework.batch.item.ItemProcessor;
20+
import org.springframework.batch.core.step.StepExecution;
21+
import org.springframework.batch.infrastructure.item.Chunk;
22+
import org.springframework.batch.infrastructure.item.ExecutionContext;
23+
import org.springframework.batch.infrastructure.item.ItemProcessor;
2424
import org.springframework.stereotype.Component;
2525

2626
@Component
@@ -32,11 +32,7 @@ public class PersonProcessor implements ItemProcessor<PersonRecord, PersonRecord
3232
public PersonRecord process(PersonRecord person) {
3333
incrementRowCount();
3434

35-
PersonRecord transformed = new PersonRecord();
36-
transformed.setId(person.getId());
37-
transformed.setFirstName(person.getFirstName().toUpperCase());
38-
transformed.setLastName(person.getLastName().toUpperCase());
39-
return transformed;
35+
return new PersonRecord(person.id(), person.firstName().toUpperCase(), person.lastName().toUpperCase());
4036
}
4137

4238
@BeforeStep
@@ -45,7 +41,7 @@ public void beforeStep(StepExecution stepExecution) {
4541
}
4642

4743
@BeforeChunk
48-
public void beforeChunk(ChunkContext chunkContext) {
44+
public void beforeChunk(Chunk<PersonRecord> chunk) {
4945
incrementChunkCount();
5046
}
5147

src/test/java/examples/springbatch/common/PersonRecord.java

Lines changed: 2 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -15,41 +15,6 @@
1515
*/
1616
package examples.springbatch.common;
1717

18-
public class PersonRecord {
19-
private Integer id;
20-
private String firstName;
21-
private String lastName;
18+
import org.jspecify.annotations.Nullable;
2219

23-
public PersonRecord() {
24-
super();
25-
}
26-
27-
public PersonRecord(String firstName, String lastName) {
28-
this.firstName = firstName;
29-
this.lastName = lastName;
30-
}
31-
32-
public Integer getId() {
33-
return id;
34-
}
35-
36-
public void setId(Integer id) {
37-
this.id = id;
38-
}
39-
40-
public String getFirstName() {
41-
return firstName;
42-
}
43-
44-
public void setFirstName(String firstName) {
45-
this.firstName = firstName;
46-
}
47-
48-
public String getLastName() {
49-
return lastName;
50-
}
51-
52-
public void setLastName(String lastName) {
53-
this.lastName = lastName;
54-
}
55-
}
20+
public record PersonRecord(@Nullable Integer id, String firstName, String lastName) {}

src/test/java/examples/springbatch/common/UpdateStatementConvertor.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
import static examples.springbatch.mapper.PersonDynamicSqlSupport.*;
1919
import static org.mybatis.dynamic.sql.SqlBuilder.isEqualTo;
2020

21+
import java.util.Objects;
22+
2123
import org.mybatis.dynamic.sql.render.RenderingStrategies;
2224
import org.mybatis.dynamic.sql.update.UpdateDSL;
2325
import org.mybatis.dynamic.sql.update.render.UpdateStatementProvider;
@@ -30,9 +32,9 @@ public class UpdateStatementConvertor implements Converter<PersonRecord, UpdateS
3032
@Override
3133
public UpdateStatementProvider convert(PersonRecord source) {
3234
return UpdateDSL.update(person)
33-
.set(firstName).equalTo(source::getFirstName)
34-
.set(lastName).equalTo(source::getLastName)
35-
.where(id, isEqualTo(source::getId))
35+
.set(firstName).equalTo(source::firstName)
36+
.set(lastName).equalTo(source::lastName)
37+
.where(id, isEqualTo(Objects.requireNonNull(source.id())))
3638
.build()
3739
.render(RenderingStrategies.MYBATIS3);
3840
}

src/test/java/examples/springbatch/cursor/CursorReaderBatchConfiguration.java

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@
2222

2323
import javax.sql.DataSource;
2424

25+
import java.util.Objects;
26+
27+
import examples.springbatch.common.PersonRecord;
28+
import examples.springbatch.mapper.PersonMapper;
2529
import org.apache.ibatis.session.SqlSessionFactory;
2630
import org.mybatis.dynamic.sql.render.RenderingStrategies;
2731
import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
@@ -31,16 +35,16 @@
3135
import org.mybatis.spring.annotation.MapperScan;
3236
import org.mybatis.spring.batch.MyBatisBatchItemWriter;
3337
import org.mybatis.spring.batch.MyBatisCursorItemReader;
34-
import org.springframework.batch.core.Job;
35-
import org.springframework.batch.core.Step;
3638
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
39+
import org.springframework.batch.core.job.Job;
3740
import org.springframework.batch.core.job.builder.JobBuilder;
38-
import org.springframework.batch.core.launch.support.RunIdIncrementer;
41+
import org.springframework.batch.core.job.parameters.RunIdIncrementer;
3942
import org.springframework.batch.core.repository.JobRepository;
43+
import org.springframework.batch.core.step.Step;
4044
import org.springframework.batch.core.step.builder.StepBuilder;
41-
import org.springframework.batch.item.ItemProcessor;
42-
import org.springframework.batch.item.ItemReader;
43-
import org.springframework.batch.item.ItemWriter;
45+
import org.springframework.batch.infrastructure.item.ItemProcessor;
46+
import org.springframework.batch.infrastructure.item.ItemReader;
47+
import org.springframework.batch.infrastructure.item.ItemWriter;
4448
import org.springframework.beans.factory.annotation.Autowired;
4549
import org.springframework.context.annotation.Bean;
4650
import org.springframework.context.annotation.ComponentScan;
@@ -51,9 +55,6 @@
5155
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
5256
import org.springframework.transaction.PlatformTransactionManager;
5357

54-
import examples.springbatch.common.PersonRecord;
55-
import examples.springbatch.mapper.PersonMapper;
56-
5758
@EnableBatchProcessing
5859
@Configuration
5960
@ComponentScan("examples.springbatch.common")
@@ -63,9 +64,6 @@ public class CursorReaderBatchConfiguration {
6364
@Autowired
6465
private JobRepository jobRepository;
6566

66-
@Autowired
67-
private PlatformTransactionManager transactionManager;
68-
6967
@Bean
7068
public DataSource dataSource() {
7169
return new EmbeddedDatabaseBuilder()
@@ -81,7 +79,7 @@ public DataSource dataSource() {
8179
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
8280
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
8381
sessionFactory.setDataSource(dataSource);
84-
return sessionFactory.getObject();
82+
return Objects.requireNonNull(sessionFactory.getObject());
8583
}
8684

8785
@Bean
@@ -117,7 +115,7 @@ public MyBatisBatchItemWriter<PersonRecord> writer(SqlSessionFactory sqlSessionF
117115
@Bean
118116
public Step step1(ItemReader<PersonRecord> reader, ItemProcessor<PersonRecord, PersonRecord> processor, ItemWriter<PersonRecord> writer) {
119117
return new StepBuilder("step1", jobRepository)
120-
.<PersonRecord, PersonRecord>chunk(10, transactionManager)
118+
.<PersonRecord, PersonRecord>chunk(10)
121119
.reader(reader)
122120
.processor(processor)
123121
.writer(writer)

src/test/java/examples/springbatch/cursor/SpringBatchCursorTest.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,29 +20,28 @@
2020
import static org.mybatis.dynamic.sql.SqlBuilder.count;
2121
import static org.mybatis.dynamic.sql.SqlBuilder.isEqualTo;
2222

23+
import examples.springbatch.mapper.PersonMapper;
2324
import org.apache.ibatis.session.SqlSession;
2425
import org.apache.ibatis.session.SqlSessionFactory;
2526
import org.junit.jupiter.api.Test;
2627
import org.mybatis.dynamic.sql.render.RenderingStrategies;
2728
import org.mybatis.dynamic.sql.select.SelectDSL;
2829
import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
2930
import org.springframework.batch.core.ExitStatus;
30-
import org.springframework.batch.core.JobExecution;
31-
import org.springframework.batch.core.StepExecution;
32-
import org.springframework.batch.item.ExecutionContext;
33-
import org.springframework.batch.test.JobLauncherTestUtils;
31+
import org.springframework.batch.core.job.JobExecution;
32+
import org.springframework.batch.core.step.StepExecution;
33+
import org.springframework.batch.infrastructure.item.ExecutionContext;
34+
import org.springframework.batch.test.JobOperatorTestUtils;
3435
import org.springframework.batch.test.context.SpringBatchTest;
3536
import org.springframework.beans.factory.annotation.Autowired;
3637
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
3738

38-
import examples.springbatch.mapper.PersonMapper;
39-
4039
@SpringBatchTest
4140
@SpringJUnitConfig(classes = CursorReaderBatchConfiguration.class)
4241
class SpringBatchCursorTest {
4342

4443
@Autowired
45-
private JobLauncherTestUtils jobLauncherTestUtils;
44+
private JobOperatorTestUtils jobOperatorTestUtils;
4645

4746
@Autowired
4847
private SqlSessionFactory sqlSessionFactory;
@@ -52,7 +51,7 @@ void testThatRowsAreTransformedToUpperCase() throws Exception {
5251
// starting condition
5352
assertThat(upperCaseRowCount()).isZero();
5453

55-
JobExecution execution = jobLauncherTestUtils.launchJob();
54+
JobExecution execution = jobOperatorTestUtils.startJob();
5655
assertThat(execution.getExitStatus()).isEqualTo(ExitStatus.COMPLETED);
5756
assertThat(numberOfRowsProcessed(execution)).isEqualTo(2);
5857

0 commit comments

Comments
 (0)