我想为我知道需要一段时间的特定工作设置Delayed::Worker.max_run_time = 1.hour
。但是,这在initializers/delayed_job_config.rb
中设置为全局配置。因此,此更改将使我的所有作业的最长运行时间为1小时。有没有办法在不创建自定义作业的情况下为一个特定作业更改它?
答案 0 :(得分:3)
查看Worker
class on GitHub:
def run(job)
job_say job, 'RUNNING'
runtime = Benchmark.realtime do
Timeout.timeout(self.class.max_run_time.to_i, WorkerTimeout) { job.invoke_job }
job.destroy
end
job_say job, 'COMPLETED after %.4f' % runtime
return true # did work
rescue DeserializationError => error
job.last_error = "#{error.message}\n#{error.backtrace.join("\n")}"
failed(job)
rescue Exception => error
self.class.lifecycle.run_callbacks(:error, self, job){ handle_failed_job(job, error) }
return false # work failed
end
您似乎无法设置每个作业的最大值。但我认为你可以在你的工作中滚动自己的超时。假设Timeout类允许嵌套!值得一试。
class MyLongJobClass
def perform
Timeout.timeout(1.hour.to_i, WorkerTimeout) { do_perform }
end
private
def do_perform
# ... real perform work
end
end
答案 1 :(得分:2)
您现在可以设置每个作业的最大运行时间,但它必须低于全局常量。
要设置覆盖Delayed :: Worker.max_run_time的每作业最大运行时间,您可以在作业上定义max_run_time方法
注意:这只能用于设置低于的max_run_time 延迟:: Worker.max_run_time。否则就会锁定工作 到期,另一名工人将开始正在进行的工作 工作
我有一个父Job类,我将max_run_time设置为10分钟。然后为我想要的那个方法覆盖那个方法。然后将全局常量设置为非常长。