批处理应用
人们在使用 Spring Boot 应用中的 Spring Batch 时,经常会遇到一些问题。本节将解答这些问题。
指定批处理数据源
默认情况下,批处理应用需要一个 DataSource
来存储 Job 详情。Spring Batch 默认期望有一个单独的 DataSource
。要使其使用应用主 DataSource
之外的 DataSource
,请声明一个 DataSource
bean,并使用 @BatchDataSource
注解其 @Bean
方法。如果您这样做并且想要两个数据源(例如保留主自动配置的 DataSource
),请将 @Bean
注解的 defaultCandidate
属性设置为 false
。为了获得更大的控制权,请将 @EnableBatchProcessing
添加到您的 @Configuration
类之一中或扩展 DefaultBatchConfiguration
。有关更多详情,请参阅 @EnableBatchProcessing
和 DefaultBatchConfiguration
的 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。