批处理应用程序
当人们在 Spring Boot 应用程序中使用 Spring Batch 时,经常会遇到一些问题。本节将解答这些问题。
指定批处理数据源
默认情况下,批处理应用程序需要一个 DataSource
来存储作业详细信息。Spring Batch 默认情况下期望一个 DataSource
。要让它使用除应用程序主 DataSource
之外的 DataSource
,请声明一个 DataSource
bean,并使用 @BatchDataSource
注释其 @Bean
方法。如果您这样做并且想要两个数据源,请记住将另一个数据源标记为 @Primary
。要获得更大的控制权,请将 @EnableBatchProcessing
添加到您的 @Configuration
类之一,或者扩展 DefaultBatchConfiguration
。有关更多详细信息,请参阅 @EnableBatchProcessing
和 DefaultBatchConfiguration
的 Javadoc。
有关 Spring Batch 的更多信息,请参阅 Spring Batch 项目页面。
指定批处理事务管理器
与 指定批处理数据源 类似,您可以通过将 PlatformTransactionManager
标记为 @BatchTransactionManager
来定义一个用于批处理的 PlatformTransactionManager
。如果您这样做并且想要两个事务管理器,请记住将另一个事务管理器标记为 @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,则必须使用实际数据库。请注意,它可以是内存数据库,请参见配置作业存储库。