延迟::作业的自动重试功能非常棒,但我现在需要手动重试这项工作。有没有一种方法我可以在工作本身上调用...
Delayed::Job.all[0].perform
或跑步,或其他什么。我尝试了一些东西,并梳理了文档,但无法弄清楚如何执行手动重试作业。
答案 0 :(得分:97)
手动调用作业
Delayed::Job.find(10).invoke_job # 10 is the job.id
如果成功运行,则不会删除该作业。您需要手动删除它:
Delayed::Job.find(10).destroy
答案 1 :(得分:27)
Delayed::Worker.new.run(Delayed::Job.last)
这将在完成后删除作业。
答案 2 :(得分:11)
你可以通过找到工作并运行表演来完全按照你所说的方式完成。
但是,我通常只是将run_at设置回来,以便作业处理器再次选择它。
答案 3 :(得分:8)
我在控制器中有一个用于测试目的的方法,当我点击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
答案 4 :(得分:6)
上述优先答案可能已过期。我发现我需要将failed_at,locked_by和locked_at设置为nil:
(对于您要重试的每项工作):
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!
答案 5 :(得分:4)
在开发环境中,通过rails console
,按照Joe Martinez的建议,重试所有延迟工作的好方法是:
Delayed::Job.all.each{|d| d.run_at = Time.now; d.save!}
答案 6 :(得分:4)
如果您需要重新运行延迟作业失败,那么您只需要选择它们并将所有内容设置为失败重试为null:
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
答案 7 :(得分:2)
Delayed::Job.all.each(&:invoke_job)
答案 8 :(得分:1)
将它放在初始化文件中!
Delayed::Job.find(1234).retry!
然后您可以运行[option][1]
这基本上会将作业重新放回队列并正常处理。