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
attempts
是受保护的属性,因此无法在update_attributes
中进行赋值。我只需执行以下操作:dj = Delayed::Job.first; dj.run_at = Time.now; dj.attempts = 0; dj.save!;
- AnjanDelayed::Job.where.not(last_error: nil).update_all(run_at: Time.current)
。 - Jason Galutenlast_error
属性。 - localhostdotdevDelayed::Worker.new.run(Delayed::Job.last)
完成后将删除该作业。
Delayed::Job.find_each(batch_size: 100) { |d| Delayed::Worker.new.run(d) }
。 - MatayoshiMariano您可以按照您所说的方式执行,找到该作业并运行 perform。
然而,通常我所做的是将 run_at 设置回来,以便作业处理器再次获取它。
Delayed :: Job.find(10).payload_object.perform
,但不应使用该方法。 - lulalala我在控制器中有一个用于测试的方法,当我访问某个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
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!}
run_at
似乎不足以解决问题。我必须执行以下操作: Delayed::Job.where("failed_at is not null").each do |dj| dj.run_at = Time.now; dj.last_error = nil; dj.failed_at = nil; dj.save! end
- steakchaserDelayed::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!
这将把作业重新放回队列并正常处理它。
Time.now - 1.day
,而是直接使用 Time.now
或 Time.zone.now
。没有必要将其推迟一天(除非是为了优先级),如果以后查看此代码可能会增加混淆。 - Joshua Pinter