はじめに
初心者向けの入門系記事です。
チャンクモデルで何かバッチを作るときに雛形として使えるようにHello Worldなプロジェクトを作ったので、その提供と超簡単な解説をします。
というのもSpring Batchはヘビー級で最初の一歩を踏み出すのが大変です(私がそうでした)。
Spring Batchのアーキテクチャを理解し、最小構成(に近いもの)で最後まで動かすまでの難易度が高いと感じたのですが、一度動きだせば多少は難易度が下がった気がしたので、他の皆様にとってのその足がかりになるような記事になればと思い公開します。
なお、本記事ではチャンクモデル選定基準や各クラスの詳細の用途の解説・紹介はしません(というかそこまで詳しくないのでQiitaでは自信をもって解説できません)。
チャンクモデル選定基準については、参考になったTERASOLUNA記事だけここに貼っておきます。
チャンクモデルとタスクレットモデルの使い分け
技術スタック
- spring boot 2.3.x
- spring batch 4.2.x
- kotlin 1.3.x
Hello World Example by Spring Boot Batch
さっそくですがサンプルコードはこちらです。
hello world example by spring boot batch
Chunk Model Activity Diaglam
ただコードを共有されても、チャンクモデルがどう動いているのか把握しづらいので簡単なアクティビティ図を記載します。
もしかしたら細かいところ間違えているかもしれません1が、アクティビティ図にするとこんな感じで動いているようです。
エラー発生時にChunkListener#afterChunkError
が呼び出されますが、この図に反映していません。
エラーが発生したらその直後に呼び出され、ステップ自体が中止されたのち、StepExecutionListener#afterStep
が呼び出されるようです。
アクティビティ図にするとこんなふうに動いていました。
登場している用語の説明
アクティビティ図だけ見ても各処理が何を意味するのかわからないとおもうので用語の簡単な解説をしておきます。
用語 | 説明 | 例 |
---|---|---|
Job | バッチの実行単位、タスク(ステップ)のまとまり。一般的なバッチジョブと同義。 | |
Step | ジョブを複数に分割する必要がある場合に、その分割したまとまりのこと | |
Chunk | reader -> processor -> writerのサイクルを回すまとまり(=何件処理するごとにコミットするか)のこと。 | 100件のデータに対してチャンクサイズ10を指定すると10のチャンクが発生。10回に分けてコミットする。 |
ItemReader | 処理対象となるデータを入力する | csvから読み込む、DB検索する |
ItemProcessor | 入力データを加工する。 加工が必要ない場合は、パススルーも可能 |
データの加工 |
ItemWriter | ItemProcessorで加工したデータに対して最終処理を行う | DBへの永続化 |
JobExecutionListener | ジョブ実行前後に処理を挟む | ログの出力、slackへの通知 |
StepExecutionListener | ステップ実行前後に処理を挟む | ログの出力、slackへの通知 |
ChunkListener | チャンク実行前後とエラー発生時に処理を挟む | ログの出力、slackへの通知 |
最後に
本記事で紹介したものはSpring Batchの機能のごく一部です。
実際にはStepの結果で分岐したり、並行実行したり、DBから読み込むItemReaderだったりファイルから読み込むItemReaderがあったり、複数のitemProcessorを合成する方法だったり、、、多岐にわたる機能があり短時間で仕様の全体像を把握するのはとても難しいと思います。
そのため、まずは今回の記事で共有したようなハローワールドレベルのプロジェクトを足がかりに必要な機能を調べて足していってはいかがでしょうか?
-
間違いに気づいた人はぜひコメントでご指摘頂けると嬉しいです。 ↩