如何为特定作业设置max_run_time?

我想为我知道需要一段时间的特定工作设置Delayed::Worker.max_run_time = 1.hour 。 但是,这在initializers/delayed_job_config.rb设置为全局配置。 因此,此更改将使我的所有作业的最长运行时间为1小时。 有没有办法在不创建自定义作业的情况下为一个特定作业更改它?

在GitHub上查看Worker 类 :

 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 

您现在可以设置每个作业的最大运行时间,但它必须低于全局常量。

要设置覆盖Delayed :: Worker.max_run_time的每作业最大运行时间,您可以在作业上定义max_run_time方法

注意:这只能用于设置低于Delayed :: Worker.max_run_time的max_run_time。 否则,作业上的锁定将到期,另一个工作人员将开始处理正在进行的作业。

我有一个父Job类,我将max_run_time设置为10分钟。 然后覆盖那个我想要很长的方法。 然后将全局常量设置为非常长。