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

再実行する必要がある遅延ジョブに失敗した場合は、それらを選択するだけで、失敗した再試行を参照するすべてを 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
于 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 に答える