SpringBootとSpring batchを使用してhello worldを表示するサンプルです。
(確認環境:Spring Boot 2.5,JDK 11)
目次
サンプル | バッチ処理実行の流れ / 読み込むCSVファイル |
ジョブとステップを実行する(BatchConfig.java) | |
Syain.java / ProcProcess.java / ProcWrite.java | |
pom.xml / application.yml | |
実行結果 |
バッチ処理実行の流れ
chunkとtaskletの違い
spring batchには処理の機能として2つあります。
チャンク(chunk)・・・入力、処理、出力の流れ。大量データを扱うのに向いています。
タスクレット(tasklet)・・・自由に記述できる。
このサンプルは、チャンクです。
作成するファイル
バッチ処理実行の主な流れは、以下のとおりです。
1.Spring boot appをクリックして起動する。
2.BatchConfig.javaでJobとstepが実行される。
→それに伴い入力(csvファイルを読み込む)、処理(testProc.javaでローマ字を大文字にする)、出力(testWrite.javaでコンソールに文字列を出力する)が実行されます。
githubにコードがあります。
https://github.com/ut23405/springbatch/tree/main/springboot-bt-chunk
読み込むCSVファイル
"1","suzuki"
"2","tanaka"
"3","hello world"
ジョブとステップを実行する(BatchConfig.java)
package com.example.demo;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.launch.support.RunIdIncrementer;
import org.springframework.batch.item.file.FlatFileItemReader;
import org.springframework.batch.item.file.builder.FlatFileItemReaderBuilder;
import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
@Configuration
@EnableBatchProcessing
public class BatchConfig {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Bean
public Job testJob1() {
return jobBuilderFactory
.get("testJob")
.incrementer(new RunIdIncrementer())
.start(testStep1())
.build();
}
@Bean
public Step testStep1() {
return stepBuilderFactory
.get("step1")
.<Syain, Syain>chunk(3)
.reader(testRead())
.processor(testProc())
.writer(testWrite())
.build();
}
@Bean
public FlatFileItemReader<Syain> testRead() {
return new FlatFileItemReaderBuilder<Syain>()
.name("testCSV")
.resource(new ClassPathResource("syain1.csv"))
.delimited().names(new String[] { "id", "romaji" })
.fieldSetMapper(new BeanWrapperFieldSetMapper<Syain>() {
{
setTargetType(Syain.class);
}
}).build();
}
@Bean
public ProcProcess testProc() {
return new ProcProcess();
}
@Bean
public ProcWrite<Syain> testWrite() {
return new ProcWrite<Syain>();
}
}
27行目は、ジョブです。
36行目は、ステップです。
47行目は、入力処理です。csvファイルを読み込みSyainクラスの項目に値をセットします。
50行目のClassPathResourceは、src/main/resources配下を読み込みます。
59行目は、加工処理を行います。省略可能です。
65行目は、出力処理を行います。
Syain.java
package com.example.demo;
public class Syain {
private String id;
private String romaji;
public Syain() {
}
public Syain(String id, String romaji) {
this.id = id;
this.romaji = romaji;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getRomaji() {
return romaji;
}
public void setRomaji(String romaji) {
this.romaji = romaji;
}
@Override
public String toString() {
return "ID=: " + id + ", romaji=: " + romaji;
}
}
エンティティです。
7行目のデフォルトコンストラクタがないとエラーになります。
26行目は、toStringのオーバーライドで値を返します。
ProcProcess.java
package com.example.demo;
import org.springframework.batch.item.ItemProcessor;
public class ProcProcess implements ItemProcessor<Syain,Syain> {
@Override
public Syain process(Syain syain) throws Exception {
final String id = syain.getId();
final String romaji = syain.getRomaji().toUpperCase();
final Syain s1 = new Syain(id,romaji);
return s1;
}
}
ローマ字を小文字から大文字に変換しています。
ProcWrite.java
package com.example.demo;
import java.util.List;
import org.springframework.batch.item.ItemWriter;
public class ProcWrite<T> implements ItemWriter<T> {
@Override
public void write(List<? extends T> items) throws Exception {
for (T item : items) {
System.out.println(item.toString());
}
}
}
エンティティの値をコンソールに出力します。
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
spring-boot-starter-batchとh2データベースをセットしています。
spring batchには何らかのデータベースが必要です。または起動ファイルで@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})とした場合は不要になります。
SpringbootBtApplication
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
@SpringBootApplication
//@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class SpringbootBtApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootBtApplication.class, args);
}
}
application.yml
server:
port: 8765
h2データベースを使用していますが設定は不要でした。
実行結果
コンソールに文字列が出力されます。
参考
https://spring.io/guides/gs/batch-processing/
関連の記事