76

Delayed::Job 的自动重试功能很棒,但是我现在想手动重试一个作业。有没有一种方法我可以调用工作本身,比如......

Delayed::Job.all[0].perform

或运行,或什么的。我尝试了一些东西,并梳理了文档,但无法弄清楚如何执行手动重试作业。

4

9 回答 9

110

手动调用作业

Delayed::Job.find(10).invoke_job # 10 is the job.id

如果作业成功运行,这不会删除作业。您需要手动删除它:

Delayed::Job.find(10).destroy
于 2010-10-26T03:30:28.290 回答
37
Delayed::Worker.new.run(Delayed::Job.last)

这将在完成后删除作业。

于 2015-09-04T08:41:08.267 回答
12

你可以完全按照你说的去做,找到工作并执行。

但是,我通常所做的只是将 run_at 设置回来,以便作业处理器重新拾取它。

于 2010-07-22T21:16:31.613 回答
10

我在控制器中有一个用于测试目的的方法,当我点击 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
于 2012-09-07T01:52:51.847 回答
8

上述先前的答案可能已过时。我发现我需要将 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!
于 2013-03-21T15:30:30.630 回答
5

如果您需要重新运行的延迟作业失败,那么您只需要选择它们并将所有涉及失败重试的内容设置为空:

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
于 2016-01-30T12:14:59.117 回答
4

在开发环境中rails console,按照 Joe Martinez 的建议,重试所有延迟作业的好方法是:

Delayed::Job.all.each{|d| d.run_at = Time.now; d.save!}
于 2013-02-28T15:16:05.603 回答
3
Delayed::Job.all.each(&:invoke_job)
于 2015-06-09T08:53:42.703 回答
2

把它放在一个初始化文件中!

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!

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

于 2017-12-29T18:08:50.377 回答