在Delayed_job中手动重试作业
Delayed :: Job的自动重试function非常好,但是现在有一个工作要手动重试。 有没有一种方法可以在工作上自己调用…
Delayed::Job.all[0].perform
或运行,或者什么的。 我尝试了一些东西,并梳理了文档,但无法弄清楚如何执行一个工作的手动重试。
手动调用作业
Delayed::Job.find(10).invoke_job # 10 is the job.id
如果成功运行,则不会删除该作业。 您需要手动删除它:
Delayed::Job.find(10).destroy
Delayed::Worker.new.run(Delayed::Job.last)
完成后将删除作业。
你可以完全按照你所说的方式去做,find工作和跑步表演。
但是,我通常所做的只是将run_at设置回来,以便作业处理器再次选取它。
我在控制器中有一个方法用于testing目的,当我点击一个URL时,重置所有延迟的工作。 不是超优雅,但对我很好:
# For testing purposes def reset_all_jobs Delayed::Job.all.each do |dj| dj.run_at = Time.now - 1.day dj.locked_at = nil dj.locked_by = nil dj.attempts = 0 dj.last_error = nil dj.save end head :ok end
上面的答案可能已经过时了。 我发现我需要将failed_at,locked_by和locked_at设置为零:
(对于每个你想要重试的工作):
d.last_error = nil d.run_at = Time.now d.failed_at = nil d.locked_at = nil d.locked_by = nil d.attempts = 0 d.failed_at = nil # needed in Rails 5 / delayed_job (4.1.2) d.save!
在开发环境中,通过rails console
,遵循Joe Martinez的build议,重试所有延迟工作的好方法是:
Delayed::Job.all.each{|d| d.run_at = Time.now; d.save!}
如果您需要重新运行的延迟作业失败,则只需select它们,并将所有引用失败的重试设置为空:
Delayed::Job.where("last_error is not null").each do |dj| dj.run_at = Time.now.advance(seconds: 5) dj.locked_at = nil dj.locked_by = nil dj.attempts = 0 dj.last_error = nil dj.failed_at = nil dj.save end
Delayed::Job.all.each(&:invoke_job)