从数据流重新启动后,Spring 批处理从头开始

Posted

技术标签:

【中文标题】从数据流重新启动后,Spring 批处理从头开始【英文标题】:Spring batch starts from beginning after restart from dataflow 【发布时间】:2020-12-26 11:34:59 【问题描述】:

我开发了一个简单的spring批处理应用程序并通过spring cloud dataflow启动它。 但是,当我从数据流重新启动失败的作业时,批处理会从头开始,而不是从最后一次执行开始。 招聘启事:

Map<String,JobParmeter> maps = new HashMap<>();
maps.put("jobID",new JobParameter(System.currentTimeMillis()));
JobExecution jobExecution = jobLauncher.run(job,new JobParameters(maps));

工作配置:

jobBuilderFactory.get("job").start(step).build();

其他一切都是@Autowired,没有自定义配置。我正在使用 Spring Boot 应用程序。

如果我不使用自定义作业启动器(上述代码中的 JobLaunch),批处理将始终重新启动。即使前一个实例已完成,也永远不会创建作业的新实例。

请帮助我正确配置作业。

【问题讨论】:

【参考方案1】:

由于您在每次运行时为作业参数添加新时间戳,因此每次都会获得不同的作业实例。如果您确实想重新启动 FAILED 作业实例,则需要传递与上次运行相同的识别作业参数(在您的情况下为 jobID)。

即使先前的实例已完成,也永远不会创建新的作业实例。

这是设计使然。无法重新启动 COMPLETED 作业实例。

【讨论】:

是的,我明白这一点,但我正在使用 spring 云数据流来重新启动一个应该传递相同参数的作业(在我的例子中是 jobID)。我没有手动传递任何参数。但每次我重新启动作业时,它都会创建新的作业实例 ID。

以上是关于从数据流重新启动后,Spring 批处理从头开始的主要内容,如果未能解决你的问题,请参考以下文章

如何从头开始重新启动gif动画?框架

重新启动 kafka 连接接收器和源连接器以从头开始读取

循环结束后从头开始重新开始迭代循环 - JS

从主管重新启动后向参与者发送消息

Spring Cloud Stream消费失败后的处理策略:重新入队(RabbitMQ)

Spring Boot - 重新启动后重新连接到数据库