How to set max_run_time for a specific job?

六月ゝ 毕业季﹏ 提交于 2019-12-11 03:36:39

问题


I want to set Delayed::Worker.max_run_time = 1.hour for a specific job that I know will take a while. However, this is set as a global configuration in initializers/delayed_job_config.rb. As a result, this change will make ALL of my jobs have a max run time of 1 hour. Is there a way to just change it for one specific job without creating a custom job?


回答1:


Looking at the 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

It doesn't appear that you can set a per-job max. But I would think you could roll your own timeout, in your job. Assuming the Timeout class allows nesting! Worth a try.

class MyLongJobClass

  def perform
    Timeout.timeout(1.hour.to_i, WorkerTimeout) { do_perform }
  end

  private

  def do_perform
    # ... real perform work
  end

end



回答2:


You can now set a per job max run time, but it must be lower than the global constant.

To set a per-job max run time that overrides the Delayed::Worker.max_run_time you can define a max_run_time method on the job

NOTE: this can ONLY be used to set a max_run_time that is lower than Delayed::Worker.max_run_time. Otherwise the lock on the job would expire and another worker would start the working on the in progress job.

I have a parent Job class where I set max_run_time to 10 minutes. Then override that method for the one that I want to be really long. Then set the global constant to be really long as well.



来源:https://stackoverflow.com/questions/18659840/how-to-set-max-run-time-for-a-specific-job

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!