问题描述
当在多台服务器上运行多个计划任务时,Shedlock 看起来很棒,但有时,我们也需要短时间或长时间暂停一些任务。 当然,可以使用额外的属性/标志来控制每个任务,但我的建议是也使用 Shedlock,并为我们希望停止的任务引入一个逻辑“节点/服务器”,并更新 shedlock 中的行-table 与此节点的锁定,并设置一个lockedAt 时间在未来,一个lockUntil 到未来+ 1 秒(因此不会触发比maxRunning 更长的时间)。然后它会自动重新开始,或者如果需要我们可以进入并将时间移到更远的未来。
对 Shedlock 的这种用途有什么想法吗……聪明还是不好的做法?它仍然用于锁定,只是将作业锁定到逻辑假服务器。
解决方法
为此有可能(错误地)使用 ShedLock。您正在寻找的更新可能如下所示:
update shedlock set lock_until = :future,locked_at = now(),locked_by = "manual" where
name = :name and lock_until < now()
重要的部分是条件 lock_until < now()
,它可以防止干扰正在运行的任务的现有锁。您不必设置 locked_by
,因为它通常会被库忽略。最好设置它,以防其他人想知道为什么没有执行任务。