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 分に設定した親 Job クラスがあります。次に、本当に長くしたいメソッドのメソッドをオーバーライドします。次に、グローバル定数も非常に長く設定します。

于 2015-08-01T00:32:45.893 に答える