在Delayed_job中手动重试作业

Mic*_*man 64 ruby rubygems ruby-on-rails delayed-job

延迟::作业的自动重试功能很棒,但我现在需要手动重试这项工作.有没有一种方法我可以在工作本身上调用...

Delayed::Job.all[0].perform
Run Code Online (Sandbox Code Playgroud)

或跑步,或某事.我尝试了一些东西,并梳理了文档,但无法弄清楚如何执行手动重试作业.

The*_*Who 100

手动调用作业

Delayed::Job.find(10).invoke_job # 10 is the job.id
Run Code Online (Sandbox Code Playgroud)

如果成功运行,则不会删除该作业.您需要手动删除它:

Delayed::Job.find(10).destroy
Run Code Online (Sandbox Code Playgroud)

  • @joe建议的替代方案更安全,特别是如果作业需要知道它是在脚本/控制台中运行还是在作业运行器内运行.尝试将队列排队以立即重试Delayed :: Job.first.update_attributes(:attempts => 0,:run_at => Time.now,:failed_at => nil,:locked_by => nil,:locked_at => nil) (10认同)
  • `attempt`不能在`update_attributes`中赋值,因为它是受保护的属性.我只是这样做:`dj =延迟:: Job.first; dj.run_at = Time.now; dj.attempts = 0; dj.save;!` (8认同)

Bee*_*tty 30

Delayed::Worker.new.run(Delayed::Job.last)
Run Code Online (Sandbox Code Playgroud)

这将在完成后删除作业.


Joe*_*nez 11

您可以通过查找作业和运行执行来完全按照您所说的方式执行此操作.

但是,我通常只是将run_at设置回来,以便作业处理器再次选择它.


Ton*_*ony 9

我在控制器中有一个用于测试目的的方法,当我点击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
Run Code Online (Sandbox Code Playgroud)

  • 使用update_all ..这是对db的一次调用. (3认同)
  • update_all直接使用SQL,因此不会调用验证(或受保护的属性等) (3认同)

jpw*_*ynn 7

上述优先答案可能已过时.我发现我需要将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!
Run Code Online (Sandbox Code Playgroud)


moh*_*him 5

如果您的延迟作业失败并需要重新运行,那么您只需要选择它们并将所有引用失败重试的内容设置为空:

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
Run Code Online (Sandbox Code Playgroud)