在Delayed_job中手动重试作业

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Delayed_job中手动重试作业相关的知识,希望对你有一定的参考价值。

延迟::作业的自动重试功能很棒,但我现在需要手动重试这项工作。有没有一种方法我可以在工作本身上调用...

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)

这将在完成后删除作业。

另一答案

您可以通过查找作业和运行执行来完全按照您所说的方式执行此操作。

但是,我通常只是将run_at设置回来,以便作业处理器再次选择它。

另一答案

我在控制器中有一个用于测试目的的方法,当我点击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设置为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!
另一答案

在开发环境中,通过rails console,遵循Joe Martinez的建议,重试所有延迟工作的好方法是:

Delayed::Job.all.each{|d| d.run_at = Time.now; d.save!}
另一答案

如果你需要重新运行的延迟作业失败,那么你只需要选择它们并设置所有引用失败的重试为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
另一答案
Delayed::Job.all.each(&:invoke_job)
另一答案

把它放在初始化文件中!

module Delayed
  module Backend
    module ActiveRecord
      class Job
        def retry!
          self.run_at = Time.now - 1.day
          self.locked_at = nil
          self.locked_by = nil
          self.attempts = 0
          self.last_error = nil
          self.failed_at = nil
          self.save!
        end
      end
    end
  end
end

然后你可以运行Delayed::Job.find(1234).retry!

这基本上会将作业重新放入队列并正常处理。

以上是关于在Delayed_job中手动重试作业的主要内容,如果未能解决你的问题,请参考以下文章

Delayed_job 不执行 perform 方法但清空作业队列

在启动时启动延迟作业

Delayed_job - 多个并行队列?

用于重复后台作业的延迟作业、守护进程或其他 gem

Python之如何优雅的重试

Node.js Kue 如何重启失败的作业