Java

【入門】Spring Batchとは?使い方やコツを解説

spring_batch_入門_使い方_初心者_コツ

本記事では
Spring Batchの使い方やコツ
を入門解説します!

対象読者

 ・Spring Batchってなに?

 ・Spring Batchってどういう仕組みなの?

 ・Spring Batchを1回で理解したい!

パロット

SpringBatchの仕組みと使い方を解説します

Spring Batchを解説しているサイト
少ないですよね…

Spring Batchは
書籍が少ないですからね

本記事でわかることは、こちら

本記事でわかること

  1. Spring BootとSpring Batchの違い
  2. Spring Batchの仕組み
  3. Spring Batchの内部構成
  4. チャンクとタスクレットの違い(ChunkとTasklet)
  5. リランとリスタートの違い
  6. Spring Batchのメタテーブルの役割(Meta Tables)

Spring Batchとは?入門ポイント!

パロット

一言で言うと、
フルマネージドなバッチシステム

Spring Batchとは
JavaフレームワークのSpringで書ける
フルマネージドなバッチシステム

です

フルマネージドなバッチシステムとは
ジョブ実装、連携、再実行などを
自分で管理できるバッチシステム

のことです

自分でジョブの設定を管理できるため
柔軟な実装が可能です

Spring Batchの特徴は、こちら

Spring Batchの特徴
(入門ポイント)

  1. 誰でも無償で利用できる
  2. 軽量なバッチフレームワーク
  3. 並列処理、直列処理が実装可能
  4. 実行タイミングを決めることができる
  5. リトライも実装可能

↓順番に説明します!

特徴1 … 誰でも無償で利用できる

Spring Batchは
Apache ライセンスバージョン2
というライセンスです
Apache License, Version 2.0
(公式サイト)

営利、非営利問わず
誰でも自由に利用・改変・再配布
ができます

そのため
Spring Batchは
多くの企業で使われています

特徴2 … 軽量なバッチフレームワーク

Spring Batchは
フルマネージドなバッチフレームワーク
でありながら軽量なフレームワークです

軽量なフレームワークとは
下記の点を指しています

軽量なフレームワークである点

  • アプリケーションの起動速度が早い
  • 実装が簡単のため、実装コストが少ない
  • 実装コストが少なく、学習コストが少ない
  • 実装が簡単にできるため、拡張や運用も簡単にできる

つまり
Springでジョブが簡単に作れる
ということです!

特徴3 … 並列処理、直列処理が実装可能

ジョブを並列や直列など
柔軟に実装できます
(下で解説)

通常はバッチを実装するとき
下記が難しい
です

 一般的なバッチシステムで
実装が難しい点

  • 実行順番の担保
  • 並行実行や、直列実行の制御
  • 実行時パラメータの引き渡し

Spring Batchでは
実行順番を担保する組み方が可能です

並列処理を実装して、処理を早く行うや
ジョブのパラメータを引き渡すことも可能です。

特徴4 … 実行タイミングを決めることができる

Spring Schedule
アノテーションを利用することで
任意の時間にバッチを動かすこと
ができます。

The @Scheduled
Annotation in Spring

Springの機能も使えるため、
Spring Batchで足りない時に
Springの機構を利用すること
ができます

特徴5 … リトライが実装可能

Sprign Batchは
ジョブの再実行にも柔軟です

個人的に
これが一番のメリット
と感じています

Spring Batchの
RerunとRestartの違い

(リランとリスタートの違い)

  • Rerun … ジョブを最初からやり直す
  • Restart … 途中からやり直す

参考 … 処理の再実行

リランとリスタートを
簡単に実装できるのは
大きなメリット

です

タスクレットとチャンクで仕様が異なるため注意

タスクレットの箇所で解説します

Spring BootとSpring Batchの違いは?

Spring Batchと
Spring Bootの違いは
Spring Batchはバッチアプリケーションに対して
Spring Bootはwebアプリケーションであること
です。

注意ポイント
Spring Batchで組んでいるから

Spring Bootが使えないということは
ありません

Spring Bootで
基本的なアプリケーション実装

Spring Batchで
バッチ処理をしたいものを実装
する
といったことが可能です。

さらに
Spring Bootと組み合わせることで
Spring BatchをAPIから発火する
ことができます。

ジョブの構成と実行(公式サイト)

Spring Batchの構成

Spring Batchのアプリケーション構成
について解説します

Spring Batchは
job, step, tasklet で構成されており
さらにService, Repositoryとも
関係しています。

Spring Batchの
アプリケーション構成

  1. Job
  2. Step
  3. Tasklet
  4. Service
  5. Repository

Job

Jobとは、Spring Batchの一番大きな概念です。

Spring Batchは、job単位で実行されます。

実行後は、1つ1つが内部のテーブルに記録されます。

ジョブの動作単位は、タスクレットとチャンクの2種類に分かれどちらかで実行されます。

ジョブの動作単位について

  1. タスクレットモデル( = シンプル)
  2. チャンクモデル( = カスタムできる)

 ↑ 必ずどちらの設定で実行されます
( = 自分でどちらかを選んで実装します)

タスクレットモデルについて

タスクレットモデルとは、ジョブを全体で1回のコミットで処理する仕組みのことです。

ジョブの途中の状態を保存することはできないので、途中からやり直したりはできません。

また大きな処理にはマシンリソース(メモリ)を大きく利用するため、小さな処理に向いています。

一方、実装はチャンクモデルより簡単に行うことができます。

チャンクモデルとは異なり、実装に必要なファイル数も少ないのが特徴です。

チャンクモデルについて

チャンクモデルとは、ジョブの任意のタイミングでコミットを行い、動作状態を保存しながら処理を行う仕組みのことです。

ジョブの状態を記録するため、途中からやり直すことが可能です。

さらに、一定間隔で記録するため、大きな処理で一気にマシンリソースは使わないため大きなバッチ処理にも対応可能です。

しかし、実装や設計が複雑であったり、ファイル数が多くなってしまうなどのデメリットがあります。

Step

stepとは、ジョブ内部の1つ1つの実行内容を管理している実装のことです。

ジョブは複数のstepを管理しています。

これらのstepを並列処理や、直列処理を設定することでジョブのワークフローを作成します。

Tasklet

taskletとは、stepの内部実装のことです。

データの取得、加工、送信など実際の処理をここに実装していきます。

Service

Serviceとは、処理のビジネスロジックを記述したものです。

Serviceは、Spring Batch特有のものではない

主に、Repositoryと関係しており、データソースから取得したデータの加工やRepositoryとの疎通を行っています。

Repository

Repositoryとは、データソースとの疎通を担っています

具体的には、データベースからデータ取得、挿入、削除などの機能を担当しており、処理の結果をServiceに渡す役割を担っています。

Spring Batchの内部の仕組み

Spring Batchが動いている仕組みを記載します。

内部の仕組みを知ることで、設定で詰まった時に解決しやすくなります

Spring Batchは、下記の仕組みを使って動作しています。

Spring Batchの仕組み

  1. Meta Database
  2. JobRepository
  3. JobLauncher
  4. Job

1つ1つ説明します!!

Meta Schema Table

Spring Batchは、内部でメタテーブルを持っています。

ジョブの実行時に、メタテーブルに書き込みながら実行します。

タスクレットモデルでも、チャンクモデルでも、メタテーブルに書き込みながら実行します。

メタテーブルは、下記のようなテーブルがあり、役割が異なります。

Spring Batchのメタテーブルについて

  1. BATCH_JOB_INSTANCE
  2. BATCH_JOB_EXECUTION_PARAMS
  3. BATCH_JOB_EXECUTION
  4. BATCH_STEP_EXECUTION
  5. BATCH_JOB_EXECUTION_CONTEXT
  6. BATCH_STEP_EXECUTION_CONTEXT

BATCH_JOB_INSTANCEテーブル

BATCH_JOB_INSTANCEテーブルは、ジョブインスタンスを格納しています。

ジョブは、インスタンスという単位で管理されており、一番大きな単位です。

BATCH_JOB_INSTANCEは、複数のBATCH_JOB_EXECUTIONを持っています。

BATCH_JOB_EXECUTION_PARAMSテーブル

BATCH_JOB_EXECUTION_PARAMSテーブルは、ジョブの実行パラメータを保持しています。

BATCH_JOB_EXECUTIONと紐づいており、どのジョブにどのパラメータを渡しているかといったことを記録しています。

そのため、ジョブにパラメータが渡せているかや、リトライ時にジョブパラメータの再取得などに利用することができます。

しかし、パラメータの取得は実装的にはBATCH_JOB_EXECUTIONから取得した方がシンプルなので使いやすい方を選択しましょう。

BATCH_JOB_EXECUTIONテーブル

BATCH_JOB_EXECUTIONテーブルは、ジョブの実行日時や、正常終了や異常終了といった実行ステータスを保持しています。

ジョブが新規で実行されるたびに、1カラム追加されます。

ジョブの実行状況を確認したい場合、BATCH_JOB_EXECUTIONテーブルを監視するようにしましょう。

BATCH_STEP_EXECUTIONテーブル

BATCH_STEP_EXECUTIONテーブルは、ジョブのstepの状態を管理しています。

stepが開始や終了された日時、中間コミット、stepの状態などを記録しています。

JobRepository

ジョブの実行時、メタテーブルへの書き込みや読み取りなどを行っています

JobLauncher

ジョブの起動や停止、リスタートを管理しています。

JobLauncherからジョブを起動すると、JobRepositoryが呼び出され、メタテーブルへ書き込みが行われます。

Job

Jobは、JobLauncherから実行されます。

前述したため、詳細は省きます。