このセクションでは、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 は全面的に次のバージョンに依存関係を更新しています。
Spring Framework 6
Spring AMQP 3
Spring for Apache Kafka 3
Micrometer 1.10
このリリースでは、次のバージョンへの移行もマークされています。
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#execAPI を使用してシステムコマンドを実行するJvmCommandRunnerです。このインターフェースは、他の API を使用してシステムコマンドを実行するように実装できます。コマンドを実行するメソッドは、コマンドとその引数を表す `String` の配列を受け入れるようになりました。コマンドをトークン化したり、前処理を行ったりする必要はもうありません。この変更により、API がより直感的になり、エラーが発生しにくくなります。
構成の更新のバッチテスト
Spring Batch 5 には、次のテスト構成の更新が含まれています。
テストユーティリティからのオートワイヤーの削除
バージョン 4.3 までは、JobLauncherTestUtils と JobRepositoryTestUtils を使用して、テスト対象のジョブとテストデータソースをオートワイヤーし、テストインフラストラクチャのセットアップを容易にしていました。これはほとんどのユースケースで便利でしたが、複数のジョブまたは複数のデータソースが定義されているテストコンテキストではいくつかの問題が発生することが判明しました。
このリリースでは、手動または @SpringBatchTest アノテーションを使用してこれらのユーティリティをインポートする際の課題を回避するために、このような依存関係のオートワイヤリングを削除するいくつかの変更を導入しました。
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] (英語) を参照してください)
別の製品としての 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 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 (英語) ) リポジトリに移動されました。