批量应用程序

当人们在 Spring Boot 应用程序中使用 Spring Batch 时,经常会遇到一些问题。本节将解答这些问题。

指定批处理数据源

默认情况下,批处理应用程序需要一个 DataSource 来存储作业详细信息。Spring Batch 默认情况下期望单个 DataSource。要使其使用应用程序主 DataSource 以外的 DataSource,请声明一个 DataSource bean,并使用 @BatchDataSource 注解其 @Bean 方法。如果这样做并且想要两个数据源,请记住将另一个标记为 @Primary。要获得更大的控制,请将 @EnableBatchProcessing 添加到你的一个 @Configuration 类中,或扩展 DefaultBatchConfiguration。有关更多详细信息,请参阅 @EnableBatchProcessingDefaultBatchConfiguration 的 API 文档。

有关 Spring Batch 的更多信息,请参阅 Spring Batch 项目页面

指定批处理事务管理器

指定批处理数据源 类似,你可以定义一个 PlatformTransactionManager 用于批处理,方法是将其标记为 @BatchTransactionManager。如果这样做并且想要两个事务管理器,请记住将另一个标记为 @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,则必须使用实际的数据库。请注意,它可以是内存数据库,请参见配置作业存储库