開発日報

窓際エンジニアの開発備忘。日報は嘘です。

SpringBatch(Tasklet) のイメージをなんとなく掴む (kotlin)

業務で訳あって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)毎にトランザクションが意識される。

参考資料

[Java][Spring Boot] Spring BatchでTaskletを使ってみる。

春のバッチ - タスクレット対チャンク

SpringBatch再入門 - 自分なりに使い方を整理してみた