批處理應用

人們在使用 Spring Boot 應用中的 Spring Batch 時,經常會遇到一些問題。本節將解答這些問題。

指定批處理資料來源

預設情況下,批處理應用需要一個 DataSource 來儲存 Job 詳情。Spring Batch 預設期望有一個單獨的 DataSource。要使其使用應用主 DataSource 之外的 DataSource,請宣告一個 DataSource bean,並使用 @BatchDataSource 註解其 @Bean 方法。如果您這樣做並且想要兩個資料來源(例如保留主自動配置的 DataSource),請將 @Bean 註解的 defaultCandidate 屬性設定為 false。為了獲得更大的控制權,請將 @EnableBatchProcessing 新增到您的 @Configuration 類之一中或擴充套件 DefaultBatchConfiguration。有關更多詳情,請參閱 @EnableBatchProcessingDefaultBatchConfiguration 的 API 文件。

有關 Spring Batch 的更多資訊,請參閱Spring Batch 專案頁面

指定批處理事務管理器

指定批處理資料來源類似,您可以透過使用 @BatchTransactionManager 註解其 @Bean 方法來定義用於批處理的 PlatformTransactionManager。如果您這樣做並且想要兩個事務管理器(例如保留自動配置的 PlatformTransactionManager),請將 @Bean 註解的 defaultCandidate 屬性設定為 false

指定批處理任務執行器

指定批處理資料來源類似,您可以透過使用 @BatchTaskExecutor 註解其 @Bean 方法來定義用於批處理的 TaskExecutor。如果您這樣做並且想要兩個任務執行器(例如保留自動配置的 TaskExecutor),請將 @Bean 註解的 defaultCandidate 屬性設定為 false

在啟動時執行 Spring Batch Job

透過將 spring-boot-starter-batch 新增到應用的類路徑中,可以啟用 Spring Batch 自動配置。

如果在應用上下文中找到單個 Job bean,它將在啟動時執行(詳見 JobLauncherApplicationRunner)。如果找到多個 Job bean,則必須使用 spring.batch.job.name 指定要執行的 Job。

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

從命令列執行

Spring Boot 將任何以 -- 開頭的命令列引數轉換為新增到 Environment 的屬性,詳見 accessing command line properties。這不應該用於向批處理 Job 傳遞引數。要在命令列上指定批處理引數,請使用常規格式(即不帶 --),如下例所示

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

如果您在命令列上指定 Environment 的屬性,則 Job 將忽略它。請考慮以下命令

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

這隻會為批處理 Job 提供一個引數:someParameter=someValue

重啟已停止或失敗的 Job

要重新啟動失敗的 Job,必須在命令列上重新指定所有引數(識別引數和非識別引數)。非識別引數不會從之前的執行中複製。這允許對其進行修改或刪除。

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

儲存 Job Repository

Spring Batch 需要一個數據儲存來存放 Job repository。如果您使用 Spring Boot,則必須使用實際的資料庫。請注意,它也可以是一個記憶體資料庫,詳見 Configuring a Job Repository