前回、R2DBCを使ってノンブロッキングなデータアクセスを実現する方法を学びました。これは、Webアプリケーションのように同時実行性と**低レイテンシ(低遅延)**が求められるオンライン処理に最適です。
しかし、システムには「夜間に全ユーザーのポイントを一括更新する」や「大量のCSVファイルを取り込み、DBに登録する」といった、トランザクション量が多く、時間がかかっても確実に処理を完了させる必要がある業務が存在します。これらをバッチ処理と呼びます。
今回は、Javaにおけるバッチ処理のデファクトスタンダードである Spring Batch の基礎と、その主要なコンポーネントについて学びます。
1. バッチ処理とは?
バッチ処理とは、データを溜め込み(バッチ)、一括して処理する手法です。
| 処理の種類 | 特徴 | 用途 |
| オンライン処理 | リアルタイム性、応答速度重視。トランザクションは短い。 | Webリクエスト、API呼び出し |
| バッチ処理 | リアルタイム性は不要、処理量・確実性重視。トランザクションは長い。 | 月次集計、データ移行、レポート生成 |
Spring Batchは、大量のデータを扱う際に必要な「再起動(リスタート)」「スキップ」「トランザクション管理」といった複雑な処理を、開発者が意識しなくても実現できるように設計されています。
2. Spring Batchのコアコンポーネント
Spring Batchは、以下の3つの主要な概念で処理を構成します。
2-1. Job(ジョブ)
Jobは、バッチ処理全体のコンテナです。「月次締め処理」「CSVファイル取り込み」など、実行される一連の処理全体を定義します。
2-2. Step(ステップ)
Stepは、Jobを構成する個々の処理単位です。一つのJobは一つ以上のStepで構成され、通常は「データを読み込む」「データを処理する」「データを書き出す」の3つの段階に分かれます。
2-3. JobInstanceとJobExecution
- JobInstance: Jobと特定のパラメータの組み合わせです。論理的な実行単位を表します。
- JobExecution: JobInstanceの物理的な一回の実行を表します。JobInstanceが失敗して再実行された場合、JobExecutionは複数存在します。Spring Batchは、このExecutionの状態をメタデータとしてDBに保持します。
3. Stepの処理モデル:Reader/Processor/Writer
Spring BatchのStepのほとんどは、**チャンク指向処理(Chunk-oriented processing)**というモデルを採用しています。これは、データを少しずつ(チャンク単位で)処理することで、メモリ効率を高め、巨大なデータでもトランザクションを細かく区切ることを可能にします。
3-1. ItemReader(データ読み込み)
- 役割: 外部リソース(DB、CSVファイル、XMLなど)からデータを一つずつ読み込み、次のProcessorに渡します。
- 例:
JdbcCursorItemReader(DBカーソル)、FlatFileItemReader(ファイル)。
3-2. ItemProcessor(データ処理)
- 役割: Readerから受け取ったデータを、ビジネスロジックに基づいて加工します。
- 例: データ形式の変換、計算、フィルタリングなど。
3-3. ItemWriter(データ書き込み)
- 役割: Processorから受け取ったデータのチャンク全体を、一括して外部リソースに書き込みます。この書き込みがトランザクション単位となります。
- 例:
JdbcBatchItemWriter(DBへの一括書き込み)、FlatFileItemWriter。
4. Spring Batchの基本的な設定
Spring BootプロジェクトにSpring Batchを導入し、Jobを定義します。
4-1. 依存関係と有効化
Groovy
dependencies {
// Spring Batchのスターター
implementation 'org.springframework.boot:spring-boot-starter-batch'
// DB接続に必要な依存関係(メタデータ保存用)
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
// ...
}
@EnableBatchProcessing を付与することで、Batch機能が有効になります。Spring Batchは、Jobの実行履歴や状態を保存するために、内部でデータベース(メタデータストア)を利用します。
4-2. JobとStepの定義
JobBuilderFactory と StepBuilderFactory を使って、JobとStepを構築します。
Java
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.job.builder.JobBuilder; // Spring Batch 5以降
import org.springframework.batch.core.repository.JobRepository; // Spring Batch 5以降
import org.springframework.batch.core.step.builder.StepBuilder; // Spring Batch 5以降
import org.springframework.transaction.PlatformTransactionManager; // Spring Batch 5以降
// ...
@Configuration
@EnableBatchProcessing
public class BatchConfig {
// Spring Batch 5以降はビルダーが簡素化
// JobRepository, PlatformTransactionManager はDIされる
@Bean
public Job importUserJob(JobRepository jobRepository, Step step1) {
return new JobBuilder("importUserJob", jobRepository)
.start(step1)
.build();
}
@Bean
public Step step1(JobRepository jobRepository, PlatformTransactionManager transactionManager, ItemReader<T> reader, ItemProcessor<T, S> processor, ItemWriter<S> writer) {
return new StepBuilder("step1", jobRepository)
.<T, S>chunk(10, transactionManager) // 10件単位でチャンク処理
.reader(reader)
.processor(processor)
.writer(writer)
.build();
}
// ItemReader, ItemProcessor, ItemWriter の Bean 定義は別途必要
}
5. まとめ:確実に処理を完遂する力
Spring Batchは、Webアプリ開発とは異なる大量データ処理という分野において、高い信頼性と運用性を提供します。Job、Step、Reader/Processor/Writerといった明確な構造により、複雑なバッチ処理も整理された形で実装でき、システムの安定稼働を支える非常に重要な技術です。
✅ 本日のまとめ
- バッチ処理は、リアルタイム性よりも大量処理の確実な完遂が求められる業務(集計、データ移行など)に使用される。
- Spring Batchは、Job(全体)、Step(処理単位)、JobExecution(実行履歴)の概念で処理を管理する。
- チャンク指向処理では、データをItemReaderで一つずつ読み込み、ItemProcessorで加工し、ItemWriterで**チャンク単位(トランザクション単位)**で一括書き込みする。
- Spring Batchは、Jobの実行状態をメタデータDBに保存するため、処理が失敗しても再起動が可能である。
- Batch処理を有効にするには
spring-boot-starter-batchの依存関係と@EnableBatchProcessingが必要である。
【Spring Framework 50回講座 完】 📖✨


コメント