Batch Applications
当人们在 Spring Boot 应用程序中使用 Spring Batch 时,经常会遇到一些问题。本节将解答这些问题。
指定批处理数据源
默认情况下,批处理应用程序需要一个 DataSource 来存储作业详情。Spring Batch 默认期望使用单个 DataSource。若要让其使用不同于应用程序主 DataSource 的数据源,请声明一个 DataSource Bean,并在其 @Bean 方法上添加 @BatchDataSource 注解。如果这样做并且希望保留两个数据源(例如保留主自动配置的 DataSource),请将 @Bean 注解的 defaultCandidate 属性设置为 false。
要禁用 Spring Boot 的自动配置并完全控制 Spring Batch 的配置,请在你的某个 @Configuration 类上添加 @EnableBatchProcessing,或者继承 DefaultBatchConfiguration。这也会同时禁用 Spring Boot 对初始化 Spring Batch 数据库 schema 的支持。
要了解更多关于手动配置 Spring Batch 的内容,请参阅 @EnableBatchProcessing 和 DefaultBatchConfiguration 的 API 文档。
有关 Spring Batch 的更多信息,请参见 Spring Batch 项目页面。
指定一个 Batch Transaction Manager
与 指定批处理数据源 类似,你可以通过在 @Bean 方法上添加 @BatchTransactionManager 注解来定义一个用于批处理的 PlatformTransactionManager。如果你这样做,并且希望保留两个事务管理器(例如保留自动配置的 PlatformTransactionManager),请将 @Bean 注解的 defaultCandidate 属性设置为 false。
指定一个 Batch Task Executor
与 指定批处理数据源 类似,你可以通过在 @Bean 方法上添加 @BatchTaskExecutor 注解来定义一个用于批处理的 TaskExecutor。如果你这样做,并且希望保留两个任务执行器(例如保留自动配置的 TaskExecutor),请将 @Bean 注解的 defaultCandidate 属性设置为 false。
在启动时运行 Spring Batch 作业
通过将 spring-boot-starter-batch 添加到应用程序的 classpath 中,即可启用 Spring Batch 的自动配置。
如果在应用上下文中找到单个 Job Bean,则会在启动时执行该 Job(详见 JobLauncherApplicationRunner)。如果找到多个 Job Bean,则必须通过 spring.batch.job.name 指定要执行的 Job。
要禁用运行应用程序上下文中找到的 Job,请将 spring.batch.job.enabled 设置为 false。
从命令行运行
Spring Boot 会将任何以 -- 开头的命令行参数转换为属性,并添加到 Environment 中,参见 访问命令行属性。这种方式不应被用于向批处理作业传递参数。若要在命令行中指定批处理参数,请使用常规格式(即不带 --),如下例所示:
$ java -jar myapp.jar someParameter=someValue anotherParameter=anotherValue
如果你在命令行上指定了 Environment 的某个属性,该作业会忽略它。请考虑以下命令:
$ java -jar myapp.jar --server.port=7070 someParameter=someValue
这仅为批处理作业提供了一个参数:someParameter=someValue。
重启已停止或失败的 Job
要重启一个失败的 Job,必须在命令行中重新指定所有参数(包括标识参数和非标识参数)。非标识参数不会从上一次执行中复制,这使得它们可以被修改或移除。
当你使用自定义的 JobParametersIncrementer 时,必须收集该增量器管理的所有参数,才能重启一个失败的执行。
存储 Job Repository
Spring Batch 需要一个数据存储来作为 Job 仓库。如果你使用 Spring Boot,则必须使用一个实际的数据库。注意,该数据库可以是内存数据库,参见 Configuring a Job Repository。