在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)