目次
- はじめに
- バッチ処理とは?
- Spring Batchとは?
- Spring Batchの典型例
- Stepの2つのモデル
- 最後に
1. はじめに
この記事は初めてバッチ処理のタスクを振られたエンジニアがバッチ処理の概要を理解して, Spring Batchで基本的なバッチ処理を実装できるようになる事を目標にしています。
記事は以下の通りの内容で何回かに分けて投稿します
- 第1回: バッチ処理とSpring Batchの概念を理解する(当記事)
- 第2回 TaskletモデルでHello Worldを出力するバッチ処理を実装する
- 第3回: Spring BatchのTaskletモデルでCSVを読み込んで加工して結果を別のCSVに書き込む処理を実装することを通して, Spring Batchの基本機能の使い方を学ぶ
- 最終回: バッチ処理を実装する際の注意事項について
2. バッチ処理とは?
バッチ処理とは、処理したいデータを一定期間溜め込んでから一括処理を行う方式で、データの読み書きを逐次実行するリアルタイム処理に比べて効率的にデータの書き込みができることができます[1]。
またバッチ処理の歴史は古く, 最初の事例としては1890年に米国国勢調査局の情報を記録するためにパンチカードを用いてバッチ処理を用いたことが挙げられます[2]。
バッチ処理の一般的な使用例としては、夜間に当日の売上をバッチ処理を用いて集計することがあります。
このように、売上のデータを一括で集計することで、売上があがるたびにデータを集計する場合に比べて、読み書きのオーバーヘッドを減らし効率的に処理することが可能です。
またバッチ処理の他の例としては、給与の計算、在庫処理、レポート作成などが挙げられます。
3. Spring Batchとは?
3.1. Spring Batchの概要
Spring Batchとは, Javaによるバッチアプリケーションを効率的に開発するために作られたバッチフレームワークであり,Springの機能を利用することができるため, DI・バリデーション・DBアクセスなどの機能を簡単に使用できることが特徴です[3]。
3.2. Spring Batchのバージョンに関して
なお現在のSpring Batchの最新バージョンは5.xですが、本記事では4.x系のバージョンを前提として説明を行います[4]。
理由としては, 筆者が関与しているプロダクトのSpring Batchのバージョンが4.x系であること, Spring Batchに関する参考文献が4.x系で書かれていることなどです。
また4.xを使用するに際して、最新のSpring BootではDeprecated(非推奨)となっているメソッドを使用することがありますが、その際に最新のSpring Bootではビルドができない場合があるので、適宜バージョンを確認しながら進めてください[5]。
4. Spring Batchの典型例
Spring Batchは主にJobLauncher, Job, Step, JobRepositoryの4つの要素で構成されます(図1)[6]。
実行時の処理の流れとしては、まずJobLauncherによってバッチ処理全体を表すJobが起動され、Jobによって複数のStepが実行され、Step内でデータの読み込み処理(ItemReader)・加工処理(ItemProcessor)・書き込み処理(ItemWriter)が実施されます。また, バッチの実行中で得た処理件数・ステータスなどのメタデータに関してはJobRepositoryに保存されます。
5. Stepの2つのモデル
Spring BatchのStepにはChunkモデルとTaskletモデルの2つのモデルが存在します。
Chunkモデルとは, データの読み込み処理(ItemReader)・加工処理(ItemProcessor)・書き込み処理(ItemWriter)というバッチ処理の定型処理を作るためのモデルで先程の図1で示したモデルはこのChunkモデルに該当すると思われます(表1)。
一方で, バッチ処理を作る際にデータの書き込みを行わない, より自由にstep記述したい場合ではTaskletモデルが使われます(表1)。
Taskletモデルの場合は, executeメソッド内に読み込み・加工・書き込み処理を自由に記述して実行することでstepが実行されます。
実装のカスタマイズ性 | 複雑さ | |
---|---|---|
Chunk | 低い. ItemReader, ItemProcessor, ItemWriterに沿って 記述しなければならないため | シンプル. 読み込み・加工 ・書き込みの定型フロー に沿えばよいため、 複雑性は低い. |
Tasklet | 高い. Taskletインタフェース のみ満たすクラスを実装すれば いいので自由度が高い. | Taskletを自由に書けるため、 プログラムが大きくなると 複雑になりやすい |
表1. ChunkモデルとTaskletモデルの特徴
6. 最後に
第1回ではバッチ処理の歴史からSpring Batchの典型的な実装パターンまでを概観しました。 第2回ではこのTaskletモデルに沿って簡単なバッチ処理を実装することを通して、Spring Batchの基本機能について解説します。