簡體   English   中英

在Delayed_job中手動重試作業

[英]Manually Retry Job in 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!

這基本上會將作業重新放入隊列並正常處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM