保持 SCDF 中的计划作业执行,直到上一个作业执行完成

Posted

技术标签:

【中文标题】保持 SCDF 中的计划作业执行,直到上一个作业执行完成【英文标题】:Hold the Scheduled Job Execution in SCDF until the previous job execution completes 【发布时间】:2021-01-05 01:52:50 【问题描述】:

我在 Openshift 环境中运行 SCDF。我正在安排一个 Spring 批处理作业每 5 分钟运行一次。有时该作业可能会运行超过 5 分钟。在这种情况下,是否可以将下一个计划的作业执行保持到前一个作业完成执行?

我们不想改变作业执行的频率和间隔。

更新 1: 最近我发现使用 Kubernetes cronjob 我们可以添加concurrencyPolicy=forbid 来阻止下一个作业执行如果前一个作业仍在运行。

我正在寻找 SCDF 中的等效配置。

谢谢。

【问题讨论】:

你为什么需要它?工作之间是否存在依赖关系?这是一个标志,工作并非完全独立于彼此。 这是一个计划每 5 分钟运行一次的作业。并在一个表中处理 1000 条记录。当第二个作业执行在第一个作业执行完成之前开始时,第二个作业读取器可能会读取旧值,或者两个作业实例可能会尝试更新同一张表中的相同记录 每个作业实例都应该处理一个固定的、唯一可识别的数据集(出于可重新启动性和作业实例识别的原因)。看来你不是这种情况。您需要找到一种方法,让每个作业实例处理一组不同的记录。 如果 job execution-1 成功完成,其中一个状态列将更新为适当的状态,并且下一个作业执行不会选择它们。问题是当第一次执行超过 5 分钟间隔并且状态列更新仍处于挂起状态时。所以他们的下一份工作也选择了同样的记录。在 Spring Boot 中使用 Normal @scheduled,下一个作业执行将在第一个作业完成之前开始,前提是它是单线程应用程序。 你使用的是哪个调度器? 【参考方案1】:

查看属性spring.cloud.task.single-instance-enabled。 Документация - Spring-cloud-task#features-single-instance-enabled 这可以防止两个同名任务运行。 我检查了 SCDF (2.6.1) 并且在运行两个相同的任务时得到了错误:

Caused by: org.springframework.cloud.task.listener.TaskExecutionException: Task with name "timestamp-task" is already running.
    at org.springframework.cloud.task.configuration.SingleInstanceTaskListener.lockTask(SingleInstanceTaskListener.java:121) ~[spring-cloud-task-core-2.2.3.RELEASE.jar!/:2.2.3.RELEASE]
    ... 31 common frames omitted

【讨论】:

以上是关于保持 SCDF 中的计划作业执行,直到上一个作业执行完成的主要内容,如果未能解决你的问题,请参考以下文章

为从 SCDF 启动的批处理作业创建的 PODS 的 ConfigMap

外部化从 SCDF 启动的任务或作业的 application.properties

获取无法序列化SCDF中任务的访问异常

如何在 Spring Cloud Data Flow 中为 Spring Batch 作业设置调度程序?

每小时调用外部 API 并单独执行约 10000 行任务的作业

Centos进程作业管理与计划任务