SpringBootとSpring batchを使用してhello worldを表示するサンプルです。
(確認環境:Spring Boot 2.5,JDK 11)
目次
サンプル | バッチ処理実行の流れ |
ジョブとステップを実行する(BatchConfig.java) | |
HelloFirst.java / HelloSecond.java | |
pom.xml / application.yml | |
実行結果 |
バッチ処理実行の流れ
chunkとtaskletの違い
spring batchには処理の機能として2つあります。
チャンク(chunk)・・・入力、処理、出力の流れ。大量データを扱うのに向いています。
タスクレット(tasklet)・・・自由に記述できる。
このサンプルは、タスクレットです。
作成するファイル
バッチ処理実行の主な流れは、以下のとおりです。
1.Spring boot appをクリックして起動する。
2.BatchConfig.javaでJobとstepが実行される。
→それに伴いHelloFirst.javaとHelloSecondも呼ばれる。
githubにコードがあります。
https://github.com/ut23405/springbatch/tree/main/springboot-bt-tasklet
ジョブとステップを実行する(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.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@EnableBatchProcessing
@Configuration
public class BatchConfig {
@Autowired private HelloFirst HelloFirst;
@Autowired private HelloSecond HelloSecond;
@Autowired private JobBuilderFactory jobBuilderFactory;
@Autowired private StepBuilderFactory stepBuilderFactory;
@Bean
public Job testJob1(Step testStep1,Step testStep2) {
return jobBuilderFactory.get("testJob")
.incrementer(new RunIdIncrementer())
.start(testStep1)
.next(testStep2)
.build();
}
@Bean
public Step testStep1() {
return stepBuilderFactory.get("TestStep11")
.tasklet(HelloFirst)
.build();
}
@Bean
public Step testStep2() {
return stepBuilderFactory.get("TestStep21")
.tasklet(HelloSecond)
.build();
}
}
22行目は、ジョブ(job)です。25,26行目でステップ(step)を実行します。
31,37行目は、ステップ(step)です。HelloFirstとHelloSecondのクラスを呼んでいます。
HelloFirst.java
package com.example.demo;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.stereotype.Component;
@Component
public class HelloFirst implements Tasklet {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext)
throws Exception {
System.out.println("Hello World First");
return RepeatStatus.FINISHED;
}
}
10行目はTaskletを実装しています。
14行目は実行されると文字列を出力します。
HelloSecond.java
package com.example.demo;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.stereotype.Component;
@Component
public class HelloSecond implements Tasklet {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext)
throws Exception {
System.out.println("Hello World Second");
return RepeatStatus.FINISHED;
}
}
10行目はTaskletを実装しています。
14行目は実行されると文字列を出力します。
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データベースを使用していますが設定は不要でした。
実行結果
コンソールに文字列が出力されます。
関連の記事