批处理应用

人们在使用 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