web-dev-qa-db-ja.com

Delayed_jobでジョブを手動で再試行する

Delayed :: Jobの自動再試行機能は優れていますが、今すぐ手動で再試行したい仕事があります。次のようなジョブ自体で呼び出すことができるメソッドはありますか...

Delayed::Job.all[0].perform

または実行、または何か。私はいくつかのことを試し、ドキュメントを調べましたが、ジョブの手動再試行を実行する方法がわかりませんでした。

62
Michael Waxman

手動でジョブを呼び出すには

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

正常に実行された場合、ジョブは削除されません。手動で削除する必要があります。

Delayed::Job.find(10).destroy
97
The Who
Delayed::Worker.new.run(Delayed::Job.last)

これにより、ジョブは完了後に削除されます。

28
Beena Shetty

ジョブを見つけて実行することで、あなたが言った通りにそれを行うことができます。

ただし、私が通常行うことは、run_atを設定し直すだけなので、ジョブプロセッサは再びそれを取得します。

11
Joe Martinez

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
9
Tony

上記の以前の回答は古くなっている可能性があります。 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!
7
jpwynn

開発環境では、Rails console、Joe Martinezの提案に従って、遅延したすべてのジョブを再試行する良い方法は次のとおりです。

Delayed::Job.all.each{|d| d.run_at = Time.now; d.save!}
4
Darme

再実行する必要がある遅延ジョブに失敗した場合は、それらを選択し、失敗した再試行を参照するすべてを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
4
mohamed-ibrahim
Delayed::Job.all.each(&:invoke_job)
2
rubycop

これを初期化ファイルに入れてください!

_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!を実行できます

これにより、基本的にジョブがキューに戻され、通常どおり処理されます。

1
Blair Anderson