TERASOLUNA Batch Framework for Java (5.x) Development Guideline
TERASOLUNA Batch Framework for Java (5.x) Development Guideline - version 5.7.1.RELEASE, 2026-3-31, commit-id:4e0b014
> INDEX

# TERASOLUNA Batch Framework for Java (5.x)のアーキテクチャ

## 概要

TERASOLUNA Batch Framework for Java (5.x)のアーキテクチャ全体像を説明する。

TERASOLUNA Batch Framework for Java (5.x)では、"一般的なバッチ処理システム"で説明したとおり Spring Batchを中心としたOSSの組み合わせを利用して実現する。

Spring Batchの階層アーキテクチャを含めたTERASOLUNA Batch Framework for Java (5.x)の構成概略図を以下に示す。

図 1. TERASOLUNA Batch Framework for Java (5.x)の構成概略図
Spring Batchの階層アーキテクチャの説明

アプリケーション

  開発者によって書かれたすべてのジョブ定義およびビジネスロジック。

コア

  Spring Batch が提供するバッチジョブを起動し、制御するために必要なコア・ランタイム・クラス。

インフラストラクチャ

  Spring Batch が提供する開発者およびコアフレームワーク自体が利用する一般的なItemReader/ItemProcessor/ItemWriterの実装。

## ジョブの構成要素

ジョブの構成要素を説明するため、ジョブの構成概略図を下記に示す。

図 2. ジョブの構成概略図

この節では、ジョブとステップについて構成すべき粒度の指針も含めて説明をする。

### ジョブ

ジョブとは、バッチ処理全体をカプセル化するエンティティであり、ステップを格納するためのコンテナである。
1つのジョブは、1つ以上のステップで構成することができる。

ジョブの定義は、XMLによるBean定義ファイルに記述する。 ジョブ定義ファイルには複数のジョブを定義することができるが、ジョブの管理が煩雑になりやすくなる。

従って、TERASOLUNA Batch Framework for Java (5.x)では以下の指針とする。

1ジョブ=1ジョブ定義ファイル

### ステップ

ステップとは、バッチ処理を制御するために必要な情報を定義したものである。 ステップにはチャンクモデルとタスクレットモデルを定義することができる。

チャンクモデル

  - ItemReader、ItemProcessor、およびItemWriterで構成される。

タスクレットモデル

  - Taskletだけで構成される。

チャンクモデル/タスクレットモデルの構成要素を実装したクラスは、`@Component`を付与してBean定義する。 "バッチ処理で考慮する原則と注意点"にあるとおり、 単一のバッチ処理では、可能な限り簡素化し、複雑な論理構造を避ける必要がある。

従って、TERASOLUNA Batch Framework for Java (5.x)では以下の指針とする。

1ステップ=1バッチ処理=1ビジネスロジック

| チャンクモデルでのビジネスロジック分割 1つのビジネスロジックが複雑で規模が大きくなる場合、ビジネスロジックを分割することがある。 概略図を見るとわかるとおり、1つのステップには1つのItemProcessorしか設定できないため、ビジネスロジックの分割ができないように思える。 しかし、CompositeItemProcssorという複数のItemProcessorをまとめるItemProcessorがあり、 この実装を使うことでビジネスロジックを分割して実行することができる。

| TERASOLUNA Batch 5.xでのBean定義 TERASOLUNA Batch 5.xでのBean定義は、以下を前提とする。 ジョブの定義は、XMLによるBean定義ファイルに記述する チャンクモデル/タスクレットモデルの構成要素を実装したクラスは、`@Component`を付与してBean定義する

## ステップの実装方式

### チャンクモデル

チャンクモデルの定義と使用目的を説明する。

定義

  ItemReader、ItemProcessorおよびItemWriter実装とチャンク数をChunkOrientedTaskletに設定する。それぞれの役割を説明する。

  - ChunkOrientedTasklet･･･ItemReader/ItemProcessorを呼び出し、チャンクを作成する。作成したチャンクをItemWriterへ渡す。

  - ItemReader･･･入力データを読み込む。

  - ItemProcessor･･･読み込んだデータを加工する。

  - ItemWriter･･･加工されたデータをチャンク単位で出力する。 :: チャンクモデルの概要は、 "チャンクモデル" を参照。

使用目的

  一定件数のデータをまとめて処理を行うため、大量データを取り扱う場合に用いられる。

### タスクレットモデル

タスクレットモデルの定義と使用目的を説明する。

定義

  Tasklet実装だけを設定する。
  タスクレットモデルの概要は、 "タスクレットモデル" を参照。

使用目的

  システムコマンドの実行など、入出力を伴わない処理を実行するために用いられる。
  また、一括でデータをコミットしたい場合にも用いられる。

### チャンクモデルとタスクレットモデルの対比

チャンクモデルとタスクレットモデルの差異について説明する。 詳細については各機能の節を参照してもらい、ここでは概略のみにとどめる。

表 1. 処理モデルの対比表
項目 | チャンクモデル | タスクレットモデル
--- | --- | ---
構成要素 | ItemReader、ItemProcessor、ItemWriter、ChunkOrientedTaskletで構成される。 | Taskletのみで構成される。
トランザクション制御 | チャンク単位にトランザクションが発生する。トランザクション制御は一定件数ごとにトランザクションを確定する中間コミット方式のみ。 | 1トランザクションで処理する。トランザクション制御は、全件を1トランザクションで確定する一括コミット方式と中間コミット方式のいずれかを利用可能。 前者はSpring Batchが持つトランザクション制御の仕組みを利用するが、後者はユーザにてトランザクションを直接操作する。
処理の再実行 | リランおよび、ステートレスリスタート(件数ベースリスタート)、ステートフルリスタート(処理状態を判断したリスタート)が利用できる。 | リランのみ利用することを原則とする。処理状態を判断したリスタートが利用できる。
例外ハンドリング | Spring Batch提供の各種`Listener`インタフェースを使うことでハンドリング処理が容易になっている。try-catchによる独自実装も可能。 | タスクレット実装内にて独自にtry-catchを実装することが基本。`ChunkListener`インタフェースの利用も可能。

## ジョブの起動方式

ジョブの起動方式について説明する。ジョブの起動方式には以下のものがある。

- 同期実行方式

- 非同期実行方式

それぞれの起動方式について説明する。

### 同期実行方式

同期実行方式とは、ジョブを起動してからジョブが終了するまで起動元へ制御が戻らない実行方式である。

ジョブスケジューラからジョブを起動する概略図を示す。

図 3. 同期実行概略図

1. ジョブスケジューラからジョブを起動するためのシェルスクリプトを起動する。
   シェルスクリプトから終了コード(数値)が返却するまでジョブスケジューラは待機する。

2. シェルスクリプトからジョブを起動するために`CommandLineJobRunner`を起動する。
   `CommandLineJobRunner`から終了コード(数値)が返却するまでシェルスクリプトは待機する。

3. `CommandLineJobRunner`はジョブを起動する。ジョブは処理終了後に終了コード(文字列)を`CommandLineJobRunner`へ返却する。
   `CommandLineJobRunner`は、ジョブから返却された終了コード(文字列)から終了コード(数値)に変換してシェルスクリプトへ返却する。

### 非同期実行方式

非同期実行方式とは、起動元とは別の実行基盤(別スレッドなど)でジョブを実行することで、ジョブ起動後すぐに起動元へ制御が戻る方式である。 この方式の場合、ジョブの実行結果はジョブ起動とは別の手段で取得する必要がある。

TERASOLUNA Batch Framework for Java (5.x)では、以下に示す2とおりの方法について説明をする。

- 非同期実行方式(DBポーリング)

- 非同期実行方式(Webコンテナ)

| その他の非同期実行方式 MQなどのメッセージを利用して非同期実行を実現することもできるが、ジョブ実行のポイントは同じであるため、TERASOLUNA Batch Framework for Java (5.x)では説明は割愛する。

#### 非同期実行方式(DBポーリング)

"非同期実行(DBポーリング)"とは、 ジョブ実行の要求をデータベースに登録し、その要求をポーリングして、ジョブを実行する方式である。

TERASOLUNA Batch Framework for Java (5.x)は、DBポーリング機能を提供している。提供しているDBポーリングによる起動の概略図を示す。

図 4. DBポーリング概略図

1. ユーザはデータベースへジョブ要求を登録する。

2. DBポーリング機能は、定期的にジョブ要求の登録を監視していて、登録されたことを検知すると該当するジョブを実行する。

   - SimpleJobOperatorからジョブを起動し、ジョブ終了後に`JobExecutionId`を受け取る。

   - JobExecutionIdとは、ジョブ実行を一意に識別するIDであり、このIDを使ってJobRepositoryから実行結果を参照する。

   - ジョブの実行結果は、Spring Batchの仕組みによって、JobRepositoryへ登録される。

   - DBポーリング自体が非同期で実行されている。

3. DBポーリング機能は、SimpleJobOperatorから返却されたJobExecutionIdとスタータスを起動したジョブ要求に対して更新を行う。

4. ジョブの処理経過・結果は、JobExecutionIdを利用して別途参照を行う。

#### 非同期実行方式(Webコンテナ)

"非同期実行(Webコンテナ)"とは、 Webコンテナ上のWebアプリケーションへのリクエストを契機にジョブを非同期実行する方式である。 Webアプリケーションは、ジョブの終了を待たずに起動後すぐにレスポンスを返却することができる。

| 非同期実行方式(Webコンテナ)の非推奨化へ向けた重要な勧告 非同期実行方式(Webコンテナ)は次期リリースより非推奨となり、その後に機能削除を予定している。 このため、非同期実行を伴うバッチアプリケーションを新規に作成する場合は "非同期実行方式(DBポーリング)" を利用すること。 現在、バッチアプリケーションで非同期実行方式(Webコンテナ)を使用しており、非同期処理として使用しているジョブを今後も利用し続ける場合は、後述のAppendix "非同期実行(Webコンテナ)から、非同期実行方式(DBポーリング)へ移行する際の基本方針" を参考に、 "非同期実行方式(DBポーリング)" への移行を検討すること。 また、本機能の非推奨化を機に非同期実行の方式を見直す必要がある場合は TERASOLUNA Server 5.x 開発ガイドライン の JMS(Jakarta Messaging) など、他の非同期実行の方式も踏まえ、最適な非同期方式を選択すること。

図 5. Webコンテナ概略図

1. クライアントからWebアプリケーションへリクエストを送信する。

2. Webアプリケーションは、リクエストから要求されたジョブを非同期実行する。

   - SimpleJobOperatorからジョブを起動直後に`JobExecutionId`を受け取る。

   - ジョブの実行結果は、Spring Batchの仕組みによって、JobRepositoryへ登録される。

3. Webアプリケーションは、ジョブの終了を待たずにクライアントへレスポンスを返信する。

4. ジョブの処理経過・結果は、JobExecutionIdを利用して別途参照を行う。

また、 TERASOLUNA Server Framework for Java (5.x)で構築されるWebアプリケーションと連携することも可能である。

## 利用する際の検討ポイント

TERASOLUNA Batch Framework for Java (5.x)を利用する際の検討ポイントを示す。

ジョブ起動方法
  同期実行方式

    スケジュールどおりにジョブを起動したり、複数のジョブを組み合わせてバッチ処理行う場合に利用する。

  非同期実行方式(DBポーリング)

    ディレード処理、処理時間が短いジョブの連続実行、大量ジョブの集約などに利用する。

  非同期実行方式(Webコンテナ)

    DBポーリングと同様だが、起動までの即時性が求められる場合にはこちらを利用する。

実装方式
  チャンクモデル

    大量データを効率よく処理したい場合に利用する。

  タスクレットモデル

    シンプルな処理や、定型化しにくい処理、データを一括で処理したい場合に利用する。

## Appendix

### 非同期実行(Webコンテナ)から、非同期実行方式(DBポーリング)へ移行する際の基本方針

"非同期実行(Webコンテナ)" の `@RestController` による RESTful Web Service のコントローラでは、リクエストから得られたジョブ名とジョブパラメータを用い、 `JobOperator` からジョブを直接起動しているが、 この箇所を下記方針で置き換える。

1. リクエストから得られたジョブ名、およびジョブパラメータを "非同期実行(DBポーリング)" のジョブ要求テーブルのレコードとしてINSERTするように置き換える。

2. 次に、バッチアプリケーションのジョブの実装、Bean定義等を "非同期実行(DBポーリング)" のアプリケーションに移行する。

3. 最後に、移行した "非同期実行(DBポーリング)" によるアプリケーションをテストする。

以上のような方法で、非同期実行方式(Webコンテナ)のジョブを、非同期実行(DBポーリング)のアプリケーションに移行することができる。

一方で、非同期実行方式(Webコンテナ)から非同期実行(DBポーリング)へ移行した場合、現行の要件および運用設計に影響しうる、以下の2点に注意すること。

- 非同期バッチデーモンの起動・停止管理

- ジョブが実行されるまでの遅延

非同期バッチデーモンの起動・停止管理
非同期実行(DBポーリング)では、ジョブを実行するプロセスとは別に、ジョブ要求テーブルをポーリングする非同期バッチデーモンを起動する必要がある。このため、非同期バッチデーモンによるジョブの待ち受けが不要になった際には、非同期バッチデーモンも停止する必要がある。

ジョブが実行されるまでの遅延
非同期実行方式(Webコンテナ)では、コントローラにリクエストが到着次第、直ちにジョブを起動することができた。一方で、非同期実行(DBポーリング)では、ジョブ要求テーブルへのレコードINSERTが行われたあと、そのレコードが非同期バッチデーモンによってポーリングされるまでジョブが起動されない。このため、非同期実行方式(DBポーリング)では、ジョブ実行の要求を行った後から起動までに、おおよそポーリング間隔時間分の遅延が発生しうる。

この他、バッチアプリケーションの機能要件、非機能要件を満たしていることについても、十分なテストを行うこと。

TERASOLUNA Batch Framework for Java (5.x) Development Guideline - version 5.7.1.RELEASE, 2026-3-31, commit-id:4e0b014
> INDEX