批处理应用程序
当人们从 Spring Boot 应用程序中使用 Spring Batch 时,经常会出现许多问题。 本节将解决这些问题。
指定 Batch 数据源
默认情况下,批处理应用程序需要 DataSource
来存储作业详细信息。
默认情况下,Spring Batch 需要一个DataSource
。
要使它使用应用程序的主DataSource
以外的DataSource
,请声明一个DataSource
Bean,并用@BatchDataSource
注释其@Bean
方法。
如果您这样做并且需要两个数据源(例如,通过保留主要的自动配置 DataSource
),请将 @Bean
注释的属性设置为 。
要进行更好的控制,请将 @EnableBatchProcessing
添加到您的 @Configuration
类之一或扩展 DefaultBatchConfiguration
。
有关更多详细信息,请参阅 @EnableBatchProcessing
和 DefaultBatchConfiguration
的 API 文档。defaultCandidate
false
有关 Spring Batch 的更多信息,请参阅 Spring Batch 项目页面。
指定 Batch Transaction Manager
与指定批处理数据源类似,您可以通过使用 @BatchTransactionManager
注释其 @Bean
方法来定义用于批处理的 PlatformTransactionManager
。
如果您这样做并且需要两个事务管理器(例如,通过保留自动配置的PlatformTransactionManager
),请将@Bean
注释的属性设置为。defaultCandidate
false
指定 Batch Task Executor
与指定批处理数据源类似,您可以通过使用 @BatchTaskExecutor
注释其 @Bean
方法来定义用于批处理的 TaskExecutor
。
如果您这样做并且需要两个任务执行程序(例如,通过保留自动配置的 TaskExecutor
),请将 @Bean
注释的属性设置为 .defaultCandidate
false
在启动时运行 Spring Batch 作业
通过添加到应用程序的 Classpath 来启用 Spring Batch 自动配置。spring-boot-starter-batch
如果在应用程序上下文中找到单个Job
Bean,则会在启动时执行该 Bean (有关详细信息,请参见JobLauncherApplicationRunner
)。
如果找到多个 Job
bean,则必须使用 指定应执行的作业。spring.batch.job.name
要禁用运行在应用程序上下文中找到的 Job
,请将 .spring.batch.job.enabled
false
有关更多详细信息,请参阅 BatchAutoConfiguration
。
从命令行运行
Spring Boot 将任何以 开头的命令行参数转换为要添加到环境中
的属性,请参见访问命令行属性。
这不应用于将参数传递给批处理作业。
要在命令行上指定批处理参数,请使用常规格式(即 without ),如以下示例所示:--
--
$ 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。