【问题标题】:How to set max_run_time for a specific job?如何为特定作业设置 max_run_time?
【发布时间】:2015-08-01 08:38:09
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    看着Workerclass 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
    

    【讨论】:

      【解决方案2】:

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

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

      注意:这只能用于设置低于 延迟::Worker.max_run_time。否则工作上的锁会 过期,另一名工人将开始进行中的工作 工作。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-23
        • 1970-01-01
        • 1970-01-01
        • 2013-04-20
        • 1970-01-01
        • 2013-10-16
        • 1970-01-01
        • 2018-06-15
        相关资源
        最近更新 更多