この記事は、Eclipse でバッチ処理を作成するにあたり、まずは簡単な枠組みを作成できるかどうかを試行錯誤しながら、進めてみたことをそのまま記載したものです。
バッチ処理自体は、処理時間が長いもの(大量のデータを入力して、加工して、出力する) などを別の処理として行うというのが何となくのイメージです。なので、ジョブとかタスクとかの考え方は無く、main関数の中で長い処理をひたすら実行するようなものをイメージしていました。ただ実際に SpringFramework の機能を使うと、ジョブ、タスクの考え方が必要でした。そこで、まずはメイン関数からジョブを実行して、ジョブの中からタスクを実行して、終了コードを設定するところまでを作ってみます。
まずは、以下のバッチ処理を作ってみます。
・BatchTestApplication(メイン)
=> BatchTestJobを起動する。(SpringFrameworkを使用)
・BatchTetJob(ジョブ)
=> BatchTestTaskletを起動する。
・BatchTestTasklet(タスク)
=> "BatchTestTasklet Start OK" と出力する (終了コードは 1 を設定する)
ポイント:バッチ処理で終了コードを設定するのが少し複雑です。
(1)BatchTestTaskletクラスに ExitCodeGenerator インターフェースを実装します。
(2)getExitCodeメソッドをオーバライドして、その中で戻り値を返すようにします。
(3)SpringApplication.exit の戻り値に(2)の戻り値が設定されます。
・BatchTestApplication.java
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
@SpringBootApplication
public class BatchTestAppApplication {
public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(BatchTestAppApplication.class, args);
int iRet = SpringApplication.exit(context);
System.out.println(iRet);
System.exit(iRet);
}
}
・BatchTestJob.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.stereotype.Component;
@Component
@EnableBatchProcessing
public class BatchTestJob {
@Autowired
private JobBuilderFactory jobFactory;
@Autowired
private StepBuilderFactory stepFactory;
@Autowired
private BatchTestTasklet batchTestTasklet;
@Bean
public Step step1() {
return stepFactory
.get("step1")
.tasklet(batchTestTasklet)
.build();
}
@Bean
public Job job(Step step1) {
return jobFactory
.get("job")
.incrementer(new RunIdIncrementer())
.start(step1)
.build();
}
}
・BatchTestTasklet.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.boot.ExitCodeGenerator;
import org.springframework.stereotype.Component;
@Component
public class BatchTestTasklet implements Tasklet, ExitCodeGenerator {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
System.out.println("BatchTestTasklet Start OK");
return RepeatStatus.FINISHED;
}
@Override
public int getExitCode() {
return 1;
}
}