批处理应用
当人们在 Spring Boot 应用程序中使用 Spring Batch 时,经常会遇到一些问题。 本节将解答这些问题。
指定 Batch Data Source
默认情况下,批处理应用程序需要一个 DataSource
来存储作业详情。
Spring Batch 默认期望使用单个 DataSource
。
要让它使用应用程序主 DataSource
之外的其他 DataSource
,请声明一个 DataSource
bean,并在其 @Bean
方法上使用 @BatchDataSource
注解。
如果这样做并且想要两个数据源(例如保留主自动配置的 DataSource
),请将 @Bean
注解的 defaultCandidate
属性设置为 false
。
要获得更多控制,请将 @EnableBatchProcessing
添加到您的 @Configuration
类之一,或扩展 DefaultBatchConfiguration
。
有关更多详细信息,请参阅 @EnableBatchProcessing
和 DefaultBatchConfiguration
的 API 文档。
有关 Spring Batch 的更多信息,请参阅 Spring Batch 项目页面。
指定 Batch Transaction Manager
与 指定 Batch Data Source 类似,您可以通过在其 @Bean
方法上使用 @BatchTransactionManager
注解来定义用于批处理的 PlatformTransactionManager
。
如果这样做并且想要两个事务管理器(例如保留自动配置的 PlatformTransactionManager
),请将 @Bean
注解的 defaultCandidate
属性设置为 false
。
指定 Batch Task Executor
与 指定 Batch Data Source 类似,您可以通过在其 @Bean
方法上使用 @BatchTaskExecutor
注解来定义用于批处理的 TaskExecutor
。
如果这样做并且想要两个任务执行器(例如保留自动配置的 TaskExecutor
),请将 @Bean
注解的 defaultCandidate
属性设置为 false
。
在启动时运行 Spring Batch Jobs
通过将 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
时,您必须收集由增量器管理的所有参数才能重启失败的执行。
存储 Job Repository
Spring Batch 需要数据存储来存储 Job
仓库。
如果您使用 Spring Boot,必须使用实际的数据库。
注意,它可以是内存数据库,请参阅 配置 Job Repository。