バッチアプリケーション

Spring Boot アプリケーション内から Spring Batch を使用する場合、多くの質問がしばしば発生します。このセクションでは、これらの質問に対処します。

バッチデータソースの指定

デフォルトでは、バッチアプリケーションにはジョブの詳細を保存するための DataSource (標準 Javadoc) が必要です。Spring Batch は、デフォルトで単一の DataSource (標準 Javadoc) を想定しています。アプリケーションのメイン DataSource (標準 Javadoc) 以外の DataSource (標準 Javadoc) を使用するには、DataSource (標準 Javadoc) Bean を宣言し、その @Bean (Javadoc) メソッドに @BatchDataSource (Javadoc) のアノテーションを付けます。これを実行して 2 つのデータソースが必要な場合 (たとえば、メインの自動構成された DataSource (標準 Javadoc) を保持する場合)、@Bean (Javadoc) アノテーションの defaultCandidate 属性を false に設定します。より細かく制御するには、@Configuration (Javadoc) クラスの 1 つに @EnableBatchProcessing (Javadoc) を追加するか、DefaultBatchConfiguration (Javadoc) を継承します。詳細については、@EnableBatchProcessing (Javadoc) および DefaultBatchConfiguration (Javadoc) の API ドキュメントを参照してください。

Spring Batch の詳細については、Spring Batch プロジェクトページを参照してください。

バッチトランザクションマネージャーの指定

バッチデータソースの指定と同様に、@Bean (Javadoc) メソッドに @BatchTransactionManager (Javadoc) をアノテーションすることで、バッチ処理で使用する PlatformTransactionManager (Javadoc) を定義できます。これを行う際に、2 つのトランザクションマネージャーが必要な場合 (たとえば、自動構成された PlatformTransactionManager (Javadoc) を保持する場合)、@Bean (Javadoc) アノテーションの defaultCandidate 属性を false に設定します。

バッチタスク実行者の指定

バッチデータソースの指定と同様に、@Bean (Javadoc) メソッドに @BatchTaskExecutor (Javadoc) をアノテーションすることで、バッチ処理で使用する TaskExecutor (Javadoc) を定義できます。これを実行し、2 つのタスクエグゼキュータが必要な場合 (たとえば、自動構成された TaskExecutor (Javadoc) を保持する場合)、@Bean (Javadoc) アノテーションの defaultCandidate 属性を false に設定します。

起動時に Spring Batch ジョブを実行する

Spring Batch 自動構成は、アプリケーションのクラスパスに spring-boot-starter-batch を追加することで有効になります。

アプリケーションコンテキストに 1 つの Job (Javadoc) Bean が見つかった場合、起動時にそれが実行されます (詳細については JobLauncherApplicationRunner (Javadoc) を参照)。複数の Job (Javadoc) Bean が見つかった場合、実行するジョブは spring.batch.job.name を使用して指定する必要があります。

アプリケーションコンテキストで見つかった Job (Javadoc) の実行を無効にするには、spring.batch.job.enabled を false に設定します。

詳細については、BatchAutoConfiguration [GitHub] (英語) を参照してください。

コマンドラインからの実行

Spring Boot は、-- で始まるすべてのコマンドライン引数を、Environment (Javadoc) に追加するプロパティに変換します。コマンドラインプロパティへのアクセスを参照してください。これは、バッチジョブに引数を渡すために使用しないでください。コマンドラインでバッチ引数を指定するには、次の例に示すように、通常の形式 (つまり、-- なし) を使用します。

$ java -jar myapp.jar someParameter=someValue anotherParameter=anotherValue

コマンドラインで Environment (Javadoc) のプロパティを指定した場合、ジョブでは無視されます。次のコマンドを検討してください。

$ java -jar myapp.jar --server.port=7070 someParameter=someValue

これは、バッチジョブに 1 つの引数 someParameter=someValue のみを提供します。

停止または失敗したジョブの再開

失敗した Job (Javadoc) を再起動するには、すべてのパラメーター (識別パラメーターと非識別パラメーター) をコマンドラインで再指定する必要があります。非識別パラメーターは前回の実行からコピーされません。これにより、非識別パラメーターを変更または削除できます。

カスタム JobParametersIncrementer (Javadoc) を使用している場合は、失敗した実行を再開するために、インクリメンターによって管理されるすべてのパラメーターを収集する必要があります。

ジョブリポジトリの保存

Spring Batch には、Job (Javadoc) リポジトリ用のデータストアが必要です。Spring Boot を使用する場合は、実際のデータベースを使用する必要があります。インメモリデータベースにできることに注意してください。ジョブリポジトリの構成を参照してください。