2013-03-26 34 views
0

我正在为一些后台服务运行delayed_job,直到最近,这些服务都是单独运行的,例如,发送电子邮件,撰写报告等。Delayed_job在进行第二个任务时进入繁忙循环

我现在需要一个delayed_job作为其最后一步提交另一个delayed_job。

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

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

但是,在这里, 代替update_status()在5秒内启动,delayed_job进入繁忙循环,触发一堆update_status调用,并且在没有暂停的情况下很难循环。

我可以看到满足所有这些调用的日志,服务器变慢,直到达到update_status的结束条件(部署最终成功或失败),并且事情再次变得安静。

我是否在使用Delayed_Job :: delay()的时候错误地忽略了这个用例的一个基本特征?

回答

0

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

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

the discussion in google groups

相关问题