Spring Cloud Task 参数不会传播到 Spring Batch 作业参数
Posted
技术标签:
【中文标题】Spring Cloud Task 参数不会传播到 Spring Batch 作业参数【英文标题】:Spring Cloud Task arguments are not propagated to Spring Batch job parameters 【发布时间】:2018-08-31 06:41:06 【问题描述】:我正在从普通的 Spring Batch 迁移到 Spring Cloud 任务,并通过 Spring Cloud 数据流执行 Spring Batch。我在我的工作和为文件注入部署的示例工作中都遇到了以下问题:
https://docs.spring.io/spring-cloud-dataflow-samples/docs/current/reference/htmlsingle/#_batch_file_ingest
我正在使用带有 postgres 后端的 spring-cloud-dataflow-server-local-1.4.0.RELEASE。我还调整了示例以使用 postgres 数据库。
当我尝试使用不同的参数第二次运行任务时会出现问题。当我第一次运行它时:
task launch fileInjectTask --arguments "filePath=classpath:data.csv --spring.cloud.task.closecontext_enable=false"
以下是日志中的输出:
2018-03-22 10:10:51.446 INFO 10431 --- [main] osbabJobLauncherCommandLineRunner:运行默认命令行:[filePath=classpath:data.csv,--spring.cloud.task.closecontext_enable=false , --spring.cloud.task.executionid=13]
2018-03-22 10:10:51.497 INFO 10431 --- [main] osbclsupport.SimpleJobLauncher:作业:[FlowJob:[name=ingestJob]] 使用以下参数启动:[filePath=classpath:data .csv, -spring.cloud.task.executionid=13, -spring.cloud.task.closecontext_enable=false, run.id=1]
没关系,参数被传递给批处理作业。现在,当我尝试使用不同的任务参数运行相同的任务时:
task launch fileInjectTask --arguments "filePath=/home/hmcmanus/spring-cloud-dataflow-samples/batch/file-ingest/src/main/resources/data.csv --spring.cloud.task.closecontext_enable=false"
我在日志中得到以下信息:
2018-03-22 10:12:18.249 INFO 10554 --- [main] osbabJobLauncherCommandLineRunner:运行默认命令行:[filePath=/home/hmcmanus/spring-cloud-dataflow-samples/batch/file-摄取/src/main/resources/data.csv,--spring.cloud.task.closecontext_enable=false,--spring.cloud.task.executionid=14]
2018-03-22 10:12:18.322 INFO 10554 --- [main] osbclsupport.SimpleJobLauncher:作业:[FlowJob:[name=ingestJob]] 使用以下参数启动:[filePath=classpath:data .csv, -spring.cloud.task.executionid=13, run.id=1, -spring.cloud.task.closecontext_enable=false]
正如您在第二个示例中看到的,任务的参数很好,但是批处理作业的参数是任务执行的旧参数。
这里有什么我遗漏的吗?为什么spring批处理作业获取不到新任务执行的参数?
更新
为了排除数据库的差异以及我需要进行的任何修改以使其运行,我还验证了数据流服务器和任务的嵌入式 H2 数据库的相同功能。
【问题讨论】:
在不使用云流服务器时,您的作业是否以正确的执行 ID 成功运行? 您之前使用相同参数执行该作业是否成功完成? @SabirKhan - 是的,在命令行中传递参数的普通老 maven: mvn clean spring-boot:run -Dspring.cloud.task.closecontext_enable=false -Dspring-boot.run.arguments= "filePath=classpath:data.csv" ``` 工作正常。 @MichaelMinella - 我不确定,所以我再次运行它,是的,上一个作业成功运行,然后使用不同的文件路径参数再次运行,任务将其拾取,但spring 批处理作业具有旧参数。 【参考方案1】:我在那个例子中遇到了同样的情况。到目前为止,我已经意识到正在使用任务的第一次执行的 id 作为参数来执行作业,在您的情况下 task.executionid=13。此值不会随着作业执行而更改。 根据 Spring Cloud 任务参考:
Spring Boot 为轻松执行批处理作业提供了便利 在一个超级罐子里。 Spring Boot 对此功能的支持允许 让开发人员在该执行中执行多个批处理作业。 Spring Cloud Task 提供了关联执行的能力 作业(作业执行)与任务的执行,以便可以 追溯到另一个。
此功能是通过使用 任务批处理执行侦听器。默认情况下,此侦听器是自动的 在配置了 Spring Batch Job 的任何上下文中配置 (通过在上下文中定义一个 Job 类型的 bean)和 spring-cloud-task-batch jar 在类路径中可用。这 监听器将被注入到所有作业中。
https://docs.spring.io/spring-cloud-task/current-SNAPSHOT/reference/htmlsingle/#batch-association
但是,在示例中,要求已按说明涵盖。
【讨论】:
感谢 Matias,我在类路径中同时注册了 Job 和 spring-cloud-task-batch jar。我可以通过能够通过 SCDF 服务器中的任务执行作业来验证这一点 - 我也可以在数据库的表中看到它,所以不确定这是不是问题。以上是关于Spring Cloud Task 参数不会传播到 Spring Batch 作业参数的主要内容,如果未能解决你的问题,请参考以下文章
Spring Cloud Task 主要是干什么的啊?跟 Quartz 和 Spring Task 有啥关系?
Spring Cloud Task 主要是干什么的啊?跟 Quartz 和 Spring Task 有啥关系?