批次應用程式

當人們在 Spring Boot 應用程式中使用 Spring Batch 時,經常會出現許多問題。本節旨在解答這些問題。

指定批次資料來源

預設情況下,批次應用程式需要 DataSource 來儲存任務詳細資訊。Spring Batch 預設期望單一 DataSource。若要使其使用應用程式主要 DataSource 以外的 DataSource,請宣告一個 DataSource bean,並使用 @BatchDataSource 註解其 @Bean 方法。如果您這樣做並想要兩個資料來源,請記住將另一個標記為 @Primary。若要取得更大的控制權,請將 @EnableBatchProcessing 新增至您的其中一個 @Configuration 類別,或擴展 DefaultBatchConfiguration。如需更多詳細資訊,請參閱 @EnableBatchProcessingDefaultBatchConfiguration 的 API 文件。

如需 Spring Batch 的更多資訊,請參閱 Spring Batch 專案頁面

指定批次交易管理器

指定批次資料來源類似,您可以定義一個 PlatformTransactionManager,透過將其標記為 @BatchTransactionManager 以在批次處理中使用。如果您這樣做並想要兩個交易管理器,請記住將另一個標記為 @Primary

在啟動時執行 Spring Batch 任務

透過將 spring-boot-starter-batch 新增至應用程式的類別路徑,即可啟用 Spring Batch 自動組態。

如果在應用程式上下文中找到單一 Job bean,則會在啟動時執行它(詳情請參閱 JobLauncherApplicationRunner)。如果找到多個 Job bean,則必須使用 spring.batch.job.name 指定應執行的任務。

若要停用執行在應用程式上下文中找到的 Job,請將 spring.batch.job.enabled 設定為 false

如需更多詳細資訊,請參閱 BatchAutoConfiguration

從命令列執行

Spring Boot 會將任何以 -- 開頭的命令列引數轉換為屬性,以新增至 Environment,請參閱存取命令列屬性。這不應用於將引數傳遞至批次任務。若要在命令列上指定批次引數,請使用常規格式(即不含 --),如下列範例所示

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

如果您在命令列上指定 Environment 的屬性,則該屬性會被任務忽略。請考慮以下命令

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

這僅為批次任務提供一個引數:someParameter=someValue

重新啟動已停止或失敗的任務

若要重新啟動失敗的 Job,所有參數(識別和非識別)都必須在命令列上重新指定。非識別參數不會從先前的執行中複製。這允許修改或移除它們。

當您使用自訂 JobParametersIncrementer 時,您必須收集增量器管理的所有參數,才能重新啟動失敗的執行。

儲存任務儲存庫

Spring Batch 需要資料儲存區來作為 Job 儲存庫。如果您使用 Spring Boot,則必須使用實際的資料庫。請注意,它可以是記憶體內資料庫,請參閱 Configuring a Job Repository