如何在定义SCDF组合任务时传递Spring Batch作业参数?
我正尝试创建一个包含两个顺序执行任务的组合任务,这两个任务内部会执行Spring Batch作业,且作业依赖Job Parameters进行后续处理。但在定义组合任务时,始终无法正确传递Spring Batch作业参数,导致执行时抛出空指针异常。
我的尝试与问题
我使用SCDF CLI创建组合任务定义,期望将start_date和end_date作为Job Parameter传递,定义语句如下:
task create --name server-test-compoesd --definition "server-apn-psp: server --spring.batch.job.names=apnPlacementStatsProcessorJob --start_date=2022-11-20T00:00:00 --end_date=2022-11-22T00:00:00 && server-dbm-psp: server --spring.batch.job.names=dbmPlacementStatsProcessorJob --start_date=2022-11-20T00:00:00 --end_date=2022-11-22T00:00:00"
执行该任务时,作业因找不到这两个Job Parameter抛出空指针异常,但我手动运行单个任务时,以不带--的方式传入参数(直接写start_date=xxx end_date=xxx),任务可正常执行。
组合任务流程为:先运行server-apn-psp对应的Spring Batch作业,再顺序执行server-dbm-psp对应的作业。
代码中访问Job Parameter的方式:
public class Test implements Tasklet { @Value("#{jobParameters['start_date']}") private String startDate; @Value("#{jobParameters['end_date']}") private String endDate; }
版本信息
- SCDF版本:
Core: 2.4.0.RELEASE (Spring Cloud Data Flow Core) Dashboard: 2.4.0.RELEASE (Spring Cloud Dataflow UI) Shell: 2.4.0.RELEASE (Spring Cloud Data Flow Shell) - Spring Batch作业版本:
spring-boot : 2.5.9 batch-core:4.1.1.RELEASE
解决方案
问题核心是:在SCDF组合任务定义中,直接用--start_date传递的是任务的应用参数,而非Spring Batch的Job Parameter。需要通过--jobParameters参数明确传递,才能被Spring Batch识别为Job Parameter。
方式一:定义任务时硬编码Job Parameter
修改CLI命令,使用--jobParameters参数传递键值对(多个参数用逗号分隔):
task create --name server-test-composed --definition "server-apn-psp: server --spring.batch.job.names=apnPlacementStatsProcessorJob --jobParameters=start_date=2022-11-20T00:00:00,end_date=2022-11-22T00:00:00 && server-dbm-psp: server --spring.batch.job.names=dbmPlacementStatsProcessorJob --jobParameters=start_date=2022-11-20T00:00:00,end_date=2022-11-22T00:00:00"
这样Spring Batch就能正确识别这些参数,代码中的@Value("#{jobParameters['start_date']}")可以正常获取到值。
方式二:定义全局参数,运行时动态传入
如果需要灵活指定参数值,可以先创建带参数占位符的组合任务:
task create --name server-test-composed --definition "server-apn-psp: server --spring.batch.job.names=apnPlacementStatsProcessorJob --jobParameters=start_date=\${start_date},end_date=\${end_date} && server-dbm-psp: server --spring.batch.job.names=dbmPlacementStatsProcessorJob --jobParameters=start_date=\${start_date},end_date=\${end_date}"
然后启动任务时传入具体参数:
task launch server-test-composed --arguments "--start_date=2022-11-20T00:00:00 --end_date=2022-11-22T00:00:00"
关键说明
SCDF中任务参数与Job Parameter是两个独立概念:
- 直接用
--xxx传递的参数会被视为应用的环境参数或启动参数,不会自动映射为Spring Batch的Job Parameter; - 必须通过
--jobParameters明确声明,Spring Batch才会将其加载为Job Parameter供作业使用。
内容的提问来源于stack exchange,提问作者divyang

