SpringBoot batchでhello world(chunk)

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/

関連の記事

SpringBoot batchでhello world(Tasklet)

△上に戻る