【发布时间】:2013-04-20 01:35:10
【问题描述】:
我需要为一项特定的工作覆盖Delayed::Worker.max_attempts,我想重试很多次。另外,我不希望以指数方式确定下一个预定时间(来自文档:5 秒 + N ** 4,其中 N 是重试次数)。
我不想覆盖Delayed::Worker 设置,并影响其他工作。
我的工作已经是一个自定义工作(我以某种方式处理错误),所以这可能会有所帮助。有关如何执行此操作的任何指示?
【问题讨论】:
我需要为一项特定的工作覆盖Delayed::Worker.max_attempts,我想重试很多次。另外,我不希望以指数方式确定下一个预定时间(来自文档:5 秒 + N ** 4,其中 N 是重试次数)。
我不想覆盖Delayed::Worker 设置,并影响其他工作。
我的工作已经是一个自定义工作(我以某种方式处理错误),所以这可能会有所帮助。有关如何执行此操作的任何指示?
【问题讨论】:
我通过查看delayed_job 源代码发现了这一点。这在他们的文档中没有任何记录。
这就是我所做的:
class MyCustomJob < Struct.new(:param1, :param2)
def perform
# do something
end
# attempts and time params are required by delayed_job
def reschedule_at(time, attempts)
30.seconds.from_now
end
def max_attempts
50
end
end
然后使用enqueue 在任何你需要的地方运行它,像这样:
Delayed::Job.enqueue( MyCustomJob.new( param1, param2 ) )
希望这对将来的某人有所帮助。
【讨论】:
reschedule_at 中的参数应该切换:github.com/collectiveidea/delayed_job/blob/…