SpringBatchで使うJob,Step,Flow,Taskletの使い方
STSでSpringBatchプロジェクトを作成してみます。
まず、「ファイル」-「新規」-「Springプロジェクト」を選択すると以下の画面が開きます。
テンプレートに「Simple Spring Batch Project」を選択して「次へ」を押下します。
パッケージ名を入力して「完了」です。
サンプルを起動してみます。
プロジェクトを右クリックし、「実行」ー「実行の構成」を選択します。
メイン・クラスに「org.springframework.batch.core.launch.support.CommandLineJobRunner」と入力します。
「引数」タブで「プログラムの引数」に「classpath:/launch-context.xml job1」と入力します。
これで「実行」を押すと、コンソールに<[Hello world!]>と表示されます。
Spring Batchのアノテーション
Spring Batchのアノテーションです。
| アノテーション | 意味 |
|---|---|
| @EnableBatchProcessing | バッチプロセスとして認識させる |
| @Configuration | ComponentScanの対象となる |
| @Bean | DIされる |
以下、サンプルです。
package jp.co.confrage.application;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecutionListener;
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.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableBatchProcessing
public class JobConfig {
@Autowired
private ATasklet tasklet1;
@Autowired
private BTasklet tasklet2;
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Bean
public Step samplestep3() {
return stepBuilderFactory.get("step-name1")
.tasklet(tasklet1)
.build();
}
@Bean
public Step samplestep2() {
return stepBuilderFactory.get("step-name2")
.tasklet(tasklet2)
.build();
}
@Bean
public Job job(@Qualifier("samplestep3") Step step1,@Qualifier("samplestep2") Step step2) {
return jobBuilderFactory.get("job2")
.incrementer(new RunIdIncrementer())
.start(step1)
.next(step2)
.build();
}
}
Jobでステップを実行してきます。incrementer(new RunIdIncrementer())メソッドはおまじないくらいの気持ちで、必須です。
そのあとのstartメソッドでstep1が実行されて、nextメソッドでstep2が実行されます。
@Qualifier(“引数名”)は、メソッド名を指定します。上記だとメソッド名は、samplestep3とsamplestep2になります。
なのでJobでは
public Job job(@Qualifier("samplestep3") Step step1,@Qualifier("samplestep2") Step step2)
と指定する必要があります。
jobメソッド内で、jobBuilderFactory.get(“job名”)としていますが、job名は任意です。
job内でstepを実行し、step内でtaskletを実行します。
step内のtaskletも複数指定することができますがここでは一つずつにしています。
ATaskletの例です。
package jp.co.confrage.application;
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 ATasklet implements Tasklet{
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
System.out.println("ATasklet");
return RepeatStatus.FINISHED;
}
}
Taskletインタフェースをimplementsする必要があります。
executeメソッドを実装する必要があるので実装します。戻り値はRepeatStatusです。
StepをFlowに纏める
Stepを直列に実行することができますが、そのステップをFlowに纏めて直列に実行することができます。
package jp.co.confrage.application;
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.job.builder.FlowBuilder;
import org.springframework.batch.core.job.flow.Flow;
import org.springframework.batch.core.launch.support.RunIdIncrementer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableBatchProcessing
public class JobConfig {
@Autowired
private ATasklet tasklet1;
@Autowired
private BTasklet tasklet2;
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Bean
public Step samplestep3() {
return stepBuilderFactory.get("step-name1")
.tasklet(tasklet1)
.build();
}
@Bean
public Step samplestep2() {
return stepBuilderFactory.get("step-name2")
.tasklet(tasklet2)
.build();
}
@Bean
public Flow sampleFlow33(@Qualifier("samplestep3") Step step1, @Qualifier("samplestep2") Step step2) {
return new FlowBuilder<Flow>("flow-name")
.from(step1)
.next(step2)
.build(); // StepをFlowに纏める(step1 → step2)
}
@Bean
public Job job(@Qualifier("sampleFlow33") Flow fff) {
return jobBuilderFactory.get("job-name")
.incrementer(new RunIdIncrementer())
.start(fff)
.end()
.build(); // JobBuilderFactoryにFlowを登録する
}
}
Jobをフローに登録する
Jobをフローに登録することも可能です。
@Bean
public Job sampleJob(JobBuilderFactory jobBuilderFactory, @Qualifier("samplestep2") Step step) {
return jobBuilderFactory.get("job-name")
.incrementer(new RunIdIncrementer())
.start(step)
.build();
}
@Bean
public Flow sampleFlow33(@Qualifier("sampleJob") Job sampleJob) {
return new FlowBuilder("flow-ni-matomeru")
.from(stepBuilderFactory.get("step-name").job(sampleJob).build())
.build(); // jobをフローに登録する
}

KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES20xx),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^






コメント