業務で訳あってSpringBatchを触ってみたのでメモ。
サンプルコード
雑なイメージ
今回はシンプルで自由度の高い、タスクレットモデルの方を前提にする。チャンクモデルは指定できるデータソースを複数にする方法が複雑そうだったり、結構制約が強く、学習コストが高そう。
- Job : Spring Batchにおけるバッチアプリケーションの一連の処理をまとめた1実行単位。
- Step : Jobを構成する処理の単位。1つのJobに1~N個のStepをもたせることが可能。 1つのJobを複数のStepに分割して処理することにより、処理の再利用、並列化、条件分岐が可能になる。
雑なソースコードイメージ
汚い作りになってて恐縮ですが、こちらが完成のサンプルコードです。
Jobクラスを返却するメソッドがJobの定義になります。 .start(yyy) .next(xxx) .next(zzz)の箇所で実際に実行するステップ(1処理)のフローを表現しています。
readStep、processStepが実処理を実装したコンポーネントクラスのインスタンスになります。
// JOB定義 @Bean @Throws(Exception::class) fun jobTest1(readStep: Step, processStep: Step, writeStep: Step): Job { return jobBuilderFactory["JobTest1"] // JOB名 .incrementer(RunIdIncrementer()) .listener(listener()) .start(readStep) ← イメージ。start next next ... と処理をつなげていく。 .next(processStep) Step間の値の受け渡しは可能。 .next(writeStep) .build() }
で、実際の処理、Stepの定義は以下になります。readStepを例にとると以下の感じです。
詳細はこちら。
executeメソッド内の処理が実行されます。割と自由にかけそうなので、汎用性は高そう。
@Component class ReadTasklet: Tasklet { override fun execute(contribution: StepContribution, chunkContext: ChunkContext): RepeatStatus { println("ReadTasklet!!") return RepeatStatus.FINISHED } }
実行イメージ
作成したSpringbootのソースをJarにし、以下のような感じで実行します。
java -jar ./build/libs/tasklet-demo-0.0.1-SNAPSHOT.jar --spring.batch.job.names=<JOB名> --spring.batch.job.enabled=true
その他できること
Step間の値の受け渡しが可能
条件分岐、エラーハンドリング可能。
JOBの中ではタスクレット(Step)毎にトランザクションが意識される。