如何为特定作业设置max_run_time?

时间:2013-09-06 14:10:32

标签: ruby-on-rails ruby delayed-job

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

2 个答案:

答案 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分钟。然后为我想要的那个方法覆盖那个方法。然后将全局常量设置为非常长。