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!
を実行できます
これにより、基本的にジョブがキューに戻され、通常どおり処理されます。