このセクションでは、Spring Batch 5 の主なハイライトを示します。詳細については、移行ガイド [GitHub] (英語) を参照してください。

Spring Batch 5.0 の新機能

Spring Batch 5.0 には次の主要なテーマがあります。

  • Java 17 要件

  • 主要な依存関係のアップグレード

  • インフラストラクチャ構成のバッチ更新

  • バッチテスト構成の更新

  • 更新を処理するジョブパラメーター

  • 実行コンテキストの直列化の更新

  • SystemCommandTasklet の更新

  • 新機能

  • 剪定

Java 17 要件

Spring Batch は、Java バージョンとサードパーティの依存関係の両方について Spring Framework のベースラインに従います。Spring Batch 5 では、Spring Framework バージョンが Spring Framework 6 にアップグレードされています。これには Java 17 が必要です。その結果、Spring Batch の Java バージョン要件も Java 17 に増加しています。

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

Spring Batch が使用するサードパーティライブラリのサポートされているバージョンとの統合を継続するために、Spring Batch 5 は全面的に次のバージョンに依存関係を更新しています。

このリリースでは、次のバージョンへの移行もマークされています。

  • Jakarta EE 9

  • Hibernate 6

バッチインフラストラクチャ構成の更新

Spring Batch 5 には、次のインフラストラクチャ構成の更新が含まれています。

データソースとトランザクションマネージャーの要件の更新

歴史的に、Spring Batch は、メモリ内のジョブリポジトリと連携するために、マップベースのジョブリポジトリとジョブエクスプローラーの実装を提供していました。これらの実装はバージョン 4 で非推奨になり、バージョン 5 で完全に削除されました。推奨される置き換えは、H2、HSQL などの組み込みデータベースで JDBC ベースの実装を使用することです。

このリリースでは、@EnableBatchProcessing アノテーションは JDBC ベースの JobRepository を構成します。これには、アプリケーションコンテキストで DataSource および PlatformTransactionManager Bean を定義する必要があります。DataSource Bean は、埋め込みデータベースを参照して、メモリ内のジョブリポジトリを操作できます。

トランザクションマネージャー Bean エクスポージャー

バージョン 4.3 までは、@EnableBatchProcessing アノテーションは、アプリケーションコンテキストでトランザクションマネージャー Bean を公開していました。これは多くの場合便利でしたが、トランザクションマネージャーの無条件の公開は、ユーザー定義のトランザクションマネージャーに干渉する可能性があります。このリリースでは、@EnableBatchProcessing はアプリケーションコンテキストでトランザクションマネージャー Bean を公開しなくなりました。

EnableBatchProcessing の新しいアノテーション属性

このリリースでは、@EnableBatchProcessing アノテーションは、バッチインフラストラクチャ Bean を構成するために使用する必要があるコンポーネントとパラメーターを指定する新しい属性を提供します。例: 次のように、ジョブリポジトリでどのデータソースとトランザクションマネージャー Spring Batch を構成する必要があるかを指定できるようになりました。

@Configuration
@EnableBatchProcessing(dataSourceRef = "batchDataSource", transactionManagerRef = "batchTransactionManager")
public class MyJobConfiguration {

	@Bean
	public Job job(JobRepository jobRepository) {
		return new JobBuilder("myJob", jobRepository)
				//define job flow as needed
				.build();
	}

}

この例では、batchDataSource と batchTransactionManager はアプリケーションコンテキスト内の Bean を参照し、ジョブリポジトリとジョブエクスプローラーの構成に使用されます。このリリースで削除されたカスタム BatchConfigurer を定義する必要はなくなりました。

インフラストラクチャ Bean の新しい構成クラス

このリリースでは、インフラストラクチャ Bean の構成に @EnableBatchProcessing を使用する代わりに、DefaultBatchConfiguration という名前の新しい構成クラスを使用できます。このクラスは、インフラストラクチャー Bean に、必要に応じてカスタマイズできるデフォルト構成を提供します。次のスニペットは、このクラスの一般的な使用箇所を示しています。

@Configuration
class MyJobConfiguration extends DefaultBatchConfiguration {

	@Bean
	public Job job(JobRepository jobRepository) {
		return new JobBuilder("myJob", jobRepository)
				//define job flow as needed
				.build();
	}

}

この例では、Job Bean 定義に挿入された JobRepository Bean が DefaultBatchConfiguration クラスで定義されています。カスタムパラメーターは、対応する getter をオーバーライドすることで指定できます。例: 次の例は、ジョブリポジトリとジョブエクスプローラーで使用される既定の文字エンコードをオーバーライドする方法を示しています。

@Configuration
class MyJobConfiguration extends DefaultBatchConfiguration {

	@Bean
	public Job job(JobRepository jobRepository) {
		return new JobBuilder("job", jobRepository)
				// define job flow as needed
				.build();
	}

	@Override
	protected Charset getCharset() {
		return StandardCharsets.ISO_8859_1;
	}
}

更新を処理するジョブパラメーター

ジョブパラメーターとしての任意の型のサポート

このバージョンでは、v4 のように事前定義された 4 つの型 (long、double、string、date) だけでなく、任意の型をジョブパラメーターとして使用するためのサポートが追加されています。この変更は、ジョブパラメーターがデータベースに保持される方法に影響を与えます (定義済みの型ごとに 4 つの個別の列はなくなりました)。DDL の変更については、BATCH_JOB_EXECUTION_PARAMS の列の変更 [GitHub] (英語) を確認してください。パラメーターの型の完全修飾名は、パラメーター値と同様に String として保持されるようになりました。文字列リテラルは、標準の Spring 変換サービスを使用してパラメーターの型に変換されます。標準変換サービスは、ユーザー固有の型を文字列リテラルとの間で変換するために必要なコンバーターで強化できます。

デフォルトのジョブパラメーター変換

v4 でのジョブパラメーターのデフォルト表記は、次のように指定されていました。

[+|-]parameterName(parameterType)=value

ここで、parameterType は [string,long,double,date] の 1 つです。この表記法は制限があり、制約があり、環境変数ではうまく機能せず、Spring Boot とは相性がよくありません。

v5 では、ジョブパラメーターを指定する方法が 2 つあります。

デフォルト表記

デフォルトの表記法は次のように指定されるようになりました。

parameterName=parameterValue,parameterType,identificationFlag

ここで、parameterType はパラメーターの型の完全修飾名です。Spring Batch は、この表記法をサポートする DefaultJobParametersConverter を提供します。

拡張表記

デフォルトの表記法はほとんどのユースケースに適していますが、値にコンマが含まれている場合などには不便な場合があります。この場合、拡張表記法を使用できます。これは、Spring Boot の Json アプリケーションのプロパティに触発され、次のように指定されます。

parameterName='{"value": "parameterValue", "type":"parameterType", "identifying": "booleanValue"}'

ここで、parameterType はパラメーターの型の完全修飾名です。Spring Batch は、この表記法をサポートする JsonJobParametersConverter を提供します。

実行コンテキストの直列化の更新

v5 以降、DefaultExecutionContextSerializer が更新され、Base64 との間でコンテキストをシリアライズ / デシリアライズするようになりました。

さらに、@EnableBatchProcessing または DefaultBatchConfiguration によって構成されたデフォルトの ExecutionContextSerializer が JacksonExecutionContextStringSerializer から DefaultExecutionContextSerializer に変更されました。Jackson への依存関係はオプションになりました。JacksonExecutionContextStringSerializer を使用するには、クラスパスに jackson-core を追加する必要があります。

SystemCommandTasklet の更新

SystemCommandTasklet はこのリリースで再検討され、次のように変更されました。

  • コマンドの実行をタスクレットの実行から分離するために、CommandRunner という名前の新しい戦略インターフェースが導入されました。デフォルトの実装は、java.lang.Runtime#exec API を使用してシステムコマンドを実行する JvmCommandRunner です。このインターフェースは、他の API を使用してシステムコマンドを実行するように実装できます。

  • コマンドを実行するメソッドは、コマンドとその引数を表す `String` の配列を受け入れるようになりました。コマンドをトークン化したり、前処理を行ったりする必要はもうありません。この変更により、API がより直感的になり、エラーが発生しにくくなります。

構成の更新のバッチテスト

Spring Batch 5 には、次のテスト構成の更新が含まれています。

テストユーティリティからのオートワイヤーの削除

バージョン 4.3 までは、JobLauncherTestUtils と JobRepositoryTestUtils を使用して、テスト対象のジョブとテストデータソースをオートワイヤーし、テストインフラストラクチャのセットアップを容易にしていました。これはほとんどのユースケースで便利でしたが、複数のジョブまたは複数のデータソースが定義されているテストコンテキストではいくつかの問題が発生することが判明しました。

このリリースでは、手動または @SpringBatchTest アノテーションを使用してこれらのユーティリティをインポートする際の課題を回避するために、このような依存関係のオートワイヤリングを削除するいくつかの変更を導入しました。

JUnit Jupiter への移行

このリリースでは、Spring Batch のテストスイート全体が JUnit 5 に移行されました。これはエンドユーザーには直接影響しませんが、Batch チームやコミュニティのコントリビューターが次世代の JUnit を使用してより優れたテストを作成できます。

新機能

JobExplorer および JobOperator でのトランザクションサポート

このリリースでは、JobExplorerFactoryBean によって作成された JobExplorer でのトランザクションサポートが導入されています。トランザクション属性をカスタマイズするだけでなく、バッチメタデータをクエリするときに、レディオンリートランザクションを駆動するために使用するトランザクションマネージャーを指定できるようになりました。

同じトランザクションサポートが、JobOperatorFactoryBean という名前の新しいファクトリ Bean を通じて JobOperator に追加されました。

EnableBatchProcessing を使用した JobOperator の自動登録

バージョン 4 の時点で、EnableBatchProcessing アノテーションは、Spring Batch ジョブを起動するために必要なすべての基本的なインフラストラクチャ Bean を提供しました。ただし、ジョブの実行を停止、再開、破棄するための主要なエントリポイントであるジョブオペレーター Bean は登録されていません。

これらのユーティリティは、ジョブの起動ほど頻繁には使用されませんが、アプリケーションコンテキストにジョブオペレータを自動的に追加すると、エンドユーザーによるこのような Bean の手動構成を回避できます。

改善された Java レコードのサポート

チャンク指向のステップでのアイテムとしての Java レコードのサポートは、最初は v4.3 で導入されましたが、v4 にはベースラインとして Java 8 があるため、そのサポートは制限されていました。最初のサポートは、Java 16 で完成した java.lang.Record API にアクセスせずに、Java レコードを作成し、それらにデータを取り込むためのリフレクショントリックに基づいていました。

v5 のベースラインとして Java 17 が使用されるようになったため、フレームワークのさまざまな部分で Record API を活用することにより、Spring Batch でのレコードサポートが改善されました。例: FlatFileItemReaderBuilder は、アイテム型がレコードであるか通常のクラスであるかを検出し、それに応じて対応する FieldSetMapper 実装を構成できるようになりました(つまり、レコードの場合は RecordFieldSetMapper、通常のクラスの場合は BeanWrapperFieldSetMapper)。ここでのゴールは、必要な FieldSetMapper 型の構成をユーザーに対して透過的にすることです。

Micrometer を使用したバッチトレース

Micrometer 1.10 へのアップグレードにより、バッチメトリクスに加えてバッチトレースを取得できるようになりました。Spring Batch は、ジョブごとにスパンを作成し、ジョブ内のステップごとにスパンを作成します。このトレースメタデータは、たとえば Zipkin (英語) などのダッシュボードで収集および表示できます。

さらに、このリリースでは、現在アクティブなステップなどの新しいメトリクスや、提供されている JobLauncher によるジョブの起動カウントが導入されています。

Java 8 の機能の更新

このメジャーリリースの機会を利用して、Java 8+ の機能でコードベースを改善しました。例:

  • インターフェースでデフォルトのメソッドを使用し、「サポート」クラスを廃止します ( 課題 3924 [GitHub] (英語) を参照してください)

  • パブリック API で必要に応じて @FunctionalInterface を追加します ( 課題 4107 [GitHub] (英語) を参照してください)

  • Date and Time API の型をジョブパラメーターとして使用するためのサポートを追加します。( 発行 1035$$ [GitHub] (英語) を参照してください)

SAP HANA ジョブリポジトリのサポート

このリリースでは、ジョブリポジトリでサポートされる追加のデータベースとして SAPHANA のサポートが導入されています。

別の製品としての MariaDB の完全サポート

v4.3 までは、Spring Batch は MariaDB を MySQL と見なしてサポートしていました。このリリースでは、MariaDB は独自の DDL スクリプトと DataFieldMaxValueIncrementer を持つ独立した製品として扱われます。

Spring Batch モジュール用の新しい Maven 部品表

この機能は何度かリクエストされており、最終的に v5 で提供されます。新しく追加された Maven BOM を使用して、一貫したバージョン番号の Spring Batch モジュールをインポートできるようになりました。

デフォルトでは UTF-8

文字エンコーディングに関連するいくつかの課題が、フレームワークのさまざまな領域で長年にわたって報告されてきました。たとえば、ファイルベースのアイテムリーダーとライター間のデフォルトエンコーディングの不一致、実行コンテキストでマルチバイト文字を処理する際のシリアライゼーション / デシリアライゼーションの課題などです。

JEP 400 (英語) と同じ精神で、UTF-8 マニフェスト (英語) に続いて、このリリースはフレームワークのすべての領域でデフォルトのエンコーディングを UTF-8 に更新し、このデフォルトが必要に応じて構成可能であることを保証します。

完全な GraalVM ネイティブサポート

GraalVM ネイティブイメージコンパイラーを使用して Spring Batch アプリケーションをネイティブ実行可能ファイルとしてコンパイルするためのサポートを提供する取り組みは、v4.2 で開始され、v4.3 で実験として提供されました。

このリリースでは、GraalVM を使用して Spring Batch アプリケーションをネイティブにコンパイルするために必要なランタイムヒントを提供することで、ネイティブサポートが大幅に改善され、現在はベータ版ではないと見なされています。

実行コンテキストメタデータの改善

Spring Batch がランタイム情報 (ステップの種類、再起動フラグなど) に関して実行コンテキストですでに保持しているものに加えて、このリリースでは、実行コンテキストに重要な詳細が追加されます。これは、コンテキストを直列化するために使用された Spring Batch バージョンです。

これは詳細に思えますが、実行コンテキストのシリアライゼーションとデシリアライゼーションに関するアップグレードの課題をデバッグするときに、大きな付加価値があります。

改善されたドキュメント

このリリースでは、Spring Asciidoctor バックエンドを使用するようにドキュメントが更新されました。このバックエンドにより、ポートフォリオのすべてのプロジェクトが同じドキュメントスタイルに従っていることが保証されます。他のプロジェクトとの一貫性を保つため、Spring Batch のリファレンスドキュメントは、このリリースでこのバックエンドを使用するように更新されました。

剪定

Spring Batch 5 は、次のような不要になった多くのアイテムを削除します。

API の非推奨と削除

このメジャーリリースでは、以前のバージョンで非推奨となりたすべての API が削除されました。さらに、一部の API は v5.0 で非推奨になり、v5.2 で削除される予定です。最後に、一部の API は、実用上の理由から非推奨となりることなく移動または削除されました。

これらの変更の詳細については、移行ガイド [GitHub] (英語) を参照してください。

SQLFire サポートの削除

SqlFire は、2014 年 11 月 1 日付けで EOL であることが発表されました。ジョブリポジトリとしての SQLFire のサポートは、バージョン v4.3 で非推奨になり、バージョン v5.0 で削除されました。

GemFire サポートの削除

Apache Geode に対する Spring Data のサポートを [ 中止する決定 ]( https://github.com/spring-projects/spring-data-geode#notice (英語) ) に基づいて、Spring Batch の Geode のサポートは削除されました。コードはコミュニティ主導の取り組みとして [spring-batch-extensions]( https://github.com/spring-projects/spring-batch-extensions (英語) ) リポジトリに移動されました。

JSR-352 実装の削除

採用されていないため、このリリースでは JSR-352 の実装が中止されました。