0

我正在为一些后台服务运行延迟作业,直到最近,所有这些服务都是孤立运行的,例如发送电子邮件、写报告等。

我现在需要一个delayed_job,作为它的最后一步,来提交另一个delayed_job。

  1. delay.deploy() - 当delayed_job 运行它时,它会触发一个部署操作,最后一步是...
  2. delay.update_status() - 当delayed_job 运行这个作业时,它会检查我们开始的部署的状态。如果部署仍在进行中,我们再次调用 delay.update_status(),如果部署已停止,我们将最终部署状态写入数据库记录。

第 1 步工作正常 - 5 秒后,delayed_job 启动部署,开始部署,然后调用 delay.update_status()。

但是在这里,update_status() 不是在 5 秒内启动,delayed_job 进入了一个繁忙的循环,触发了一堆 update_status 调用,并且在没有暂停的情况下非常努力地循环。

我可以看到所有这些调用都填满了日志,服务器变慢了,直到达到 update_status 的结束条件(部署最终成功或失败),然后一切又恢复平静。

我是否错误地使用了 Delayed_Job::delay(),我是否缺少此用例的基本原则?

4

1 回答 1

0

好的,事实证明这是“预期的行为” - 如果您已经在为延迟作业运行的代码中,并且您再次调用 .delay() 而不指定延迟,它将立即运行。您需要添加参数run_at:

  delay(queue: :deploy, run_at: 10.seconds.from_now).check_status

查看google 群组中的讨论

于 2013-05-10T05:54:22.670 回答