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(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント