【发布时间】: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,下一个作业执行将在第一个作业完成之前开始,前提是它是单线程应用程序。
-
你使用的是哪个调度器?
标签: java spring-boot spring-batch openshift spring-cloud-dataflow