2

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

4

2 回答 2

3

查看Worker 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
于 2013-09-06T14:34:16.580 回答
2

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

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

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

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

于 2015-08-01T00:32:45.893 回答