Delayed :: Jobの自動再試行機能は素晴らしいですが、今すぐ手動で再試行したいジョブがあります。仕事自体で呼び出すことができるメソッドはありますか...
Delayed::Job.all[0].perform
または実行、または何か。私はいくつかのことを試し、ドキュメントをまとめましたが、ジョブの手動再試行を実行する方法を理解できませんでした。
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!
再実行する必要がある遅延ジョブに失敗した場合は、それらを選択するだけで、失敗した再試行を参照するすべてを 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
開発環境ではrails console
、Joe Martinez の提案に従って、遅延したすべてのジョブを再試行する良い方法は次のとおりです。
Delayed::Job.all.each{|d| d.run_at = Time.now; d.save!}
Delayed::Job.all.each(&:invoke_job)