Spring Batch 5.1 の新機能

依存関係のアップグレード

このリリースでは、Spring の依存関係が次のバージョンにアップグレードされます。

  • Spring Framework 6.1.0

  • Spring Integration 6.2.0

  • Spring Data 3.2.0

  • Spring LDAP 3.2.0

  • Spring AMQP 3.1.0

  • Spring Kafka 3.1.0

  • Micrometer 1.12.0

仮想スレッドのサポート

JDK 21 LTS の採用は、Spring Batch 5.1 の主要テーマの 1 つであり、特に Project Loom の仮想スレッドのサポートです。このリリースでは、仮想スレッドを使用して同時ステップを実行したり、仮想スレッドを使用して複数のステップを並行して起動したりするなど、フレームワークのすべての領域で仮想スレッドを使用できます。

Spring Batch では問題の分離が適切に設計されているため、スレッドは直接管理されません。スレッド管理は、Spring Framework から TaskExecutor 実装に委譲されます。このプログラミングからインターフェースへのアプローチにより、TaskExecutor 実装を透過的かつ柔軟な方法で切り替えることができます。

Spring Framework 6.1 では、仮想スレッドに基づく新しい TaskExecutor 実装 ( VirtualThreadTaskExecutor) が導入されました。この TaskExecutor は、TaskExecutor が必要な場合はどこでも Spring Batch で使用できます。

JpaItemWriter のメモリ管理の改善

JpaItemWriter を使用する場合、チャンクサイズが十分に大きい場合、JPA 永続コンテキストは急速に大きくなる可能性があります。これを適時に適切にクリアしないと、OutOfMemoryError エラーが発生する可能性があります。

このリリースでは、項目の各チャンクを書き込んだ後に永続コンテキストをクリアするために、clearPersistenceContext という名前の新しいオプションが JpaItemWriter に導入されました。このオプションは、大量のデータと大きなチャンクサイズを処理するチャンク指向のステップのメモリ管理を改善します。

アイテムのリーダーとライターのための新しい同期デコレーター

バージョン 5.0 までの Spring Batch には、スレッドアクセスを ItemStreamReader#read および ItemStreamWriter#write に同期するために 2 つのデコレーター SynchronizedItemStreamReader および SynchronizedItemStreamWriter が提供されていました。これらのデコレータは、マルチスレッドステップで非スレッドセーフな項目ストリームを使用する場合に役立ちます。

これらのデコレータは ItemStream 実装で動作しますが、非項目ストリームでは使用できません。例: これらのデコレータは、ListItemReader#read または KafkaItemWriter#write へのアクセスを同期するために使用できません。

ユーザーの利便性を考慮して、このリリースではアイテム以外のストリームにも新しいデコレータが導入されました。この新機能により、カスタムデコレータを作成しなくても、Spring Batch のすべてのアイテムリーダーとライターを同期できるようになりました。

新しいカーソルベースの MongoItemReader

バージョン 5.0 まで、Spring Batch によって提供される MongoItemReader は、MongoDB の skip 操作に基づくページネーションを使用していました。これは小規模 / 中規模のデータセットではうまく機能しますが、大規模なデータセットではパフォーマンスが低下し始めます。

このリリースでは、MongoDB 用の新しいカーソルベースの項目リーダーである MongoCursorItemReader が導入されています。この実装では、ページングの代わりにカーソルを使用して MongoDB からデータを読み取り、大規模なコレクションの読み取りパフォーマンスを向上させます。他のカーソル / ページングリーダーとの一貫性を保つために、現在の MongoItemReader は MongoPagingItemReader に名前変更されました。

MongoItemWriter での一括挿入のサポート

バージョン 5.0 まで、MongoItemWriter は upsert と delete の 2 つの操作をサポートしていました。upsert 操作は挿入と更新の両方に対して適切に機能しますが、ターゲットコレクション内で新しいことがわかっている項目に対しては適切に機能しません。

JpaItemWriter の persist および merge 操作と同様に、このリリースでは、一括挿入用に設計された insert という名前の新しい操作が MongoItemWriter に追加されています。この新しいオプションは、アイテムがターゲットコレクションにすでに存在するかどうかを確認するために追加の検索を必要としないため、新しいアイテムに対して upsert よりも優れたパフォーマンスを発揮します。

Redis 用新項目リーダーライター

新しい RedisItemReader が内蔵アイテムリーダーのライブラリで利用できるようになりました。このリーダーは Spring Data Redis に基づいており、Redis から読み取るように設定されたキーをスキャンするように ScanOptions を構成できます。

同様に、Spring Data Redis をベースにした新しい RedisItemWriter がライターライブラリの一部になりました。このライターは、Redis に項目を書き込むように RedisTemplate を使用して構成できます。

JobRegistryBeanPostProcessor の自動構成

Spring Batch アプリケーションで JobOperator を設定する場合、オペレーターの JobRegistry にジョブを登録する必要があります。この登録プロセスは手動で実行されるか、アプリケーションコンテキストに JobRegistryBeanPostProcessor Bean を追加することによって自動的に実行されます。

このリリースでは、Spring Batch のデフォルト構成 (つまり、@EnableBatchProcessing を使用するか DefaultBatchConfiguration を継承することによる) により、JobRegistryBeanPostProcessor Bean がアプリケーションコンテキストに自動的に登録されるようになりました。これにより、構成プロセスが簡素化され、JobOperator を使用する際のユーザーエクスペリエンスが向上します。

決定を下してジョブフローを開始する機能

XML 構成スタイルを使用する場合、<decision> 要素のおかげで、ディサイダーを使用してジョブフローを開始することができます。ただし、バージョン 5.0 までは、Java API で同じフロー定義を実現することはできませんでした。

このリリースでは、JobExecutionDecider でジョブフローを開始する新しいオプションが JobBuilder API に追加されました。これにより、両方の構成スタイルの一貫性が高まります。

カスタム JobKeyGenerator を提供する機能

デフォルトでは、Spring Batch は、識別ジョブパラメーターの MD5 ハッシュを計算することによってジョブインスタンスを識別します。この識別プロセスをカスタマイズする必要はほとんどありませんが、Spring Batch はユーザーが JobKeyGenerator API を通じてデフォルトのメカニズムをオーバーライドするための戦略インターフェースを提供します。

バージョン 5.0 までは、カスタム JobRepository および JobExplorer を作成することなくカスタムキージェネレーターを提供することはできませんでした。このバージョンでは、JobRepository および JobExplorer のファクトリ Bean を通じてカスタム JobKeyGenerator を提供できるようになりました。

Antora に基づく新しいドキュメント

リファレンスドキュメントは Antora (英語) を使用するように更新されました。このアップデートでは、以下を含むがこれらに限定されない多くの改善が導入されています。

  • マルチバージョンのドキュメント: 左側のメニューのドロップダウンバージョンリストにより、あるバージョンから別のバージョンに移動できるようになりました。

  • 統合された検索エクスペリエンス: Algolia (英語) を利用し、ページの左上に統合された検索ボックスのおかげで検索エクスペリエンスが向上しました。

  • 設定スタイルの切り替えの改善: コードスニペットの XML 構成スタイルと Java 構成スタイルを切り替えるトグルが、各ページの上部ではなく、各サンプルの近くに配置されるようになりました。

開始エクスペリエンスの向上

このリリースでは、開始時のエクスペリエンスがさまざまな方法で改善されました。

MongoDB ジョブリポジトリ (実験用)

この機能では、MongoDB によってサポートされる JobRepository および JobExplorer の新しい実装が導入されます。この待望の機能は実験版として利用可能になり、Spring Batch 用の最初の NoSQL メタデータストアの導入を示します。

この機能の詳細については、Spring Batch 実験版 [GitHub] (英語) リポジトリを参照してください。

複合アイテムリーダー (実験用)

この機能では、複合 ItemReader 実装が導入されます。CompositeItemProcessor および CompositeItemWriter と同様に、このアイデアは、読み取りを順番にアイテムリーダーのリストに委譲することです。これは、異なるソース (ファイル、データベースなど) から同じ形式のデータを読み取る必要がある場合に便利です。

この機能の詳細については、Spring Batch 実験版 [GitHub] (英語) リポジトリを参照してください。

新しいチャンク指向ステップの実装 (実験用)

これは新しい機能ではなく、チャンク指向の処理モデルの新しい実装です。ゴールは、現在の実装で報告されている課題に対処し、今後の再設計された同時実行モデルの新しいベースを提供することです。

この新しい実装の詳細については、Spring Batch 実験版 [GitHub] (英語) リポジトリを参照してください。