Delayed::Worker.max_run_time = 1.hour
時間がかかることがわかっている特定の仕事に取り掛かりたい。ただし、これは でグローバル コンフィギュレーションとして設定されますinitializers/delayed_job_config.rb
。結果として、この変更により、すべてのジョブの最大実行時間が 1 時間になります。カスタム ジョブを作成せずに特定のジョブ用に変更する方法はありますか?
1835 次
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 に答える