SpringBatch:ChunkモデルとTaskletモデルの概要について

アイキャッチ画像

はじめに

本記事はIT会社勤務の100名程の研修生を見てきた元Java研修講師が、Javaのアプリやシステムなどでバッチ処理の際に多く使われるであろうSpringBatchについて、ChunkモデルとTaskletモデルってどうやって作るのか。そこのお話しをしていきます。

前提条件

「バッチ処理とは」「SpringBatchの概要」この2つは完璧でなくともふわんりとした理解があり、なんとなく分かる程度の知識がある前提でお話しさせて頂きます。SpringBatchを学習し始めたところ!って人には向いているかなと思います!

Chunkモデル

Chunkモデルとは大量のデータを「一定件数ずつ分割して処理する」ための仕組みです。

Chunkモデルを使う意図としては、例えば100万件の売上データを処理する場合。1件ずつ処理していたら遅いですし、100万件を一括で処理すると負荷に耐えられないかもしれません。(例:100件読み込み⇨処理⇨書き込み(コミット)を繰り返すことができる。)

そこで、ChunkモデルではStepを「3つのコンポーネント」に分けて処理を書いていきます。

  • 3つのコンポーネント

コンポーネントとは、特定の役割を担う部品やパーツです。プログラミングにおいてコンポーネントとは、「役割ごとに機能を分担して管理しやすくした部品」です。

  • ItemReader(アイテムリーダー)

データの読み込みを担当するコンポーネントです。処理対象のデータを設定された件まで、1件ずつCSVファイルやDBから読み込み、次のコンポーネントに渡す準備をします。

CSVファイルからの読み込み処理(FlatFileItemReader)を書いたり、DBからレコードを取り出す(JdbcCursorItemReader)処理を書き、次のコンポーネントに渡す準備をします。

  • ItemProcessor(アイテムプロセッサー)

データの加工・変換などを担当するコンポーネントです。Readerで読み込んで渡されたデータを1件ずつ加工・変換していきます。バッチ処理の中でのメインロジックを扱うのがこのコンポーネントになります。処理の具体例としては、無効なデータの除外や金額を税抜から税込にするなどが挙げられます。

  • ItemWriter(アイテムライター)

加工や変換をされたデータをまとめて一括で処理する担当のコンポーネントです。無効なデータや金額の表記変更を行ったデータをDBに登録したり、新たなCSVファイルに書き込む処理を行います。

このようにChunkモデルでは、各コンポーネントで役割を明確に分けて処理を書きます。エラーなどが起こったときは該当の箇所のコンポーネントを調査すれば良いので、エラー原因を特定しやすい面もあります。また、Chunkサイズの設定で、大量のデータを一定件数ごとに効率よく安全に処理できます。

Taskletモデル

「1回だけの処理」を実行します。Chunkモデルと違い、Stepを分けずに1つのStepにすべての処理を書きます。古いファイルの削除などの一度だけの単純なファイル操作の場合や、バッチ処理が完了した通知メールを一斉に送るなどのデータ加工がない場合に適しています。

一定件数のバッチ処理をする前に、いらないデータを消すときに使用し、その後Chunkモデルで処理をし、完了した通知メールを送るなど、「Tasklet⇨Chunk⇨Tasklet」などと組み合わせて使うことが多い。

Javaだと、クラスに分けずに全てmainメソッドで処理を書いてしまうやり方に近いですね!

まとめ

以上のように、バッチ処理を作る上で2つの方法があると分かってもらえたと思います。それぞれ特徴や適している場面が明確になっているので、この処理はどっちで書けば良いのか見極めてください。Taskletですべてのバッチ処理を書くこともできますが、やはり大量のデータを扱うことは前提にあるので、大量のデータを扱うときはChunkモデルのほうが適しているようになっています。