跳到主要内容

批处理应用

DeepSeek V3 中英对照 Batch Applications

当人们在 Spring Boot 应用程序中使用 Spring Batch 时,常常会遇到一些问题。本节将解答这些常见问题。

指定批处理数据源

默认情况下,批处理应用程序需要一个 DataSource 来存储作业详情。Spring Batch 默认期望使用单一的 DataSource。如果希望它使用应用程序主 DataSource 之外的其他 DataSource,可以声明一个 DataSource Bean,并在其 @Bean 方法上使用 @BatchDataSource 注解。如果这样做并且希望保留两个数据源(例如保留主自动配置的 DataSource),可以将 @Bean 注解的 defaultCandidate 属性设置为 false。为了获得更大的控制权,可以在其中一个 @Configuration 类中添加 @EnableBatchProcessing,或者扩展 DefaultBatchConfiguration。更多详细信息,请参阅 @EnableBatchProcessingDefaultBatchConfiguration 的 API 文档。

有关 Spring Batch 的更多信息,请参阅 Spring Batch 项目页面

指定批处理事务管理器

类似于指定批量数据源,你可以通过使用 @BatchTransactionManager 注解标记 @Bean 方法来定义一个用于批处理的 PlatformTransactionManager。如果你这样做并且希望保留两个事务管理器(例如保留自动配置的 PlatformTransactionManager),请将 @Bean 注解的 defaultCandidate 属性设置为 false

指定批处理任务执行器

类似于指定批处理数据源,你可以通过使用 @BatchTaskExecutor 注解来定义用于批处理的 TaskExecutor,并将其标注在 @Bean 方法上。如果你这样做并且希望保留两个任务执行器(例如保留自动配置的 TaskExecutor),请将 @Bean 注解的 defaultCandidate 属性设置为 false

在启动时运行 Spring Batch 作业

Spring Batch 的自动配置功能可以通过在应用程序的类路径中添加 spring-boot-starter-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
shell

如果你在命令行中指定了 Environment 的一个属性,它将会被作业忽略。请考虑以下命令:

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

这为批处理作业仅提供了一个参数:someParameter=someValue

重启已停止或失败的作业

要重新启动一个失败的 Job,必须在命令行中重新指定所有参数(包括标识参数和非标识参数)。非标识参数不会从之前的执行中复制。这样可以修改或删除它们。

备注

当你使用自定义的 JobParametersIncrementer 时,你需要收集由增量器管理的所有参数,以便重新启动失败的执行。

存储作业仓库

Spring Batch 需要一个数据存储来作为 Job 仓库。如果你使用 Spring Boot,你必须使用一个实际的数据库。注意,它可以是内存数据库,具体请参阅 配置 Job 仓库