Batch Applications
当人们在 Spring Boot 应用程序中使用 Spring Batch 时,经常会遇到一些问题。本节将解答这些问题。
指定批处理数据源
将作业详情存储在 SQL 数据库中的批处理应用程序需要一个 DataSource Bean。默认情况下,只需要一个 DataSource Bean。若要让 Spring Batch 使用不同于应用程序主 DataSource 的数据源,请声明一个 DataSource Bean,并在其 @Bean 方法上添加 @BatchDataSource 注解。如果这样做并且希望保留两个数据源(例如同时保留主自动配置的 DataSource),请将 @Bean 注解的 defaultCandidate 属性设置为 false。
指定一个 Batch Transaction Manager
与指定批处理数据源类似,你可以通过在 [@Bean](https://docs.spring.io/spring-framework/docs/7.0.x/javadoc-api/org/springframework/context/annotation/Bean.html) 方法上添加 @BatchTransactionManager 注解,来定义一个用于批处理的 PlatformTransactionManager。如果你这样做,并且希望保留两个事务管理器(例如同时保留自动配置的 PlatformTransactionManager),请将 @Bean 注解的 defaultCandidate 属性设置为 false。
指定一个 Batch Task Executor
与 指定批处理数据源 类似,你可以通过在 @Bean 方法上添加 @BatchTaskExecutor 注解来定义一个用于批处理的 TaskExecutor。如果你这样做,并且希望保留两个任务执行器(例如同时保留自动配置的 TaskExecutor),请将 @Bean 注解的 defaultCandidate 属性设置为 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 时,必须收集该增量器所管理的所有参数,才能重启失败的执行。