gpt4 book ai didi

ruby-on-rails - 如何让 Active Job 永远重试所有作业?

转载 作者:行者123 更新时间:2023-12-04 01:06:15 33 4
gpt4 key购买 nike

我不希望活跃的工作在失败时放弃工作。我希望有机会修复故障,然后让它们重新运行。我试过这样做:

class ApplicationJob < ActiveJob::Base
retry_on Exception, attempts: Float::INFINITY
end
但它没有用。电子邮件作业失败并被丢弃。我使用 delay_job 作为实现。
任何想法如何做到?

最佳答案

如果您使用的是 Delayed::Job,您最终会得到两个相互叠加的重试机制。 Active Job、Rails 一般实现和 Delayed::Job。
对于 Active::Job,您可以执行以下操作:

class ApplicationJob < ActiveJob::Base
retry_on Exception, wait: :exponentially_longer, attempts: Float::INFINITY
end
没有 wait: :exponentially_longer ,您可能会每 3 秒尝试很多作业。
如果您使用的是 Delayed::Job,这种重试方法的行为可能有点奇怪。作业运行并似乎成功了,但由于它失败了,ActiveJob 创建了一个新的,以便稍后运行。因此该字段 attempts在 Delayed::Job 中保持为 0,您需要查看该字段 handler看看它运行了多少次。
一个 ActiveJob 最后一次失败,异常冒泡到 Delayed::Job,它有自己的重试机制。延迟::默认作业 retries 25 times and then deletes the job .
为了让 Delayed Job 永远继续尝试,你可以创建一个初始化文件 config/initializers/delayed_job_config.rb更改 max_attempts值(value)观:
Delayed::Worker.max_attempts = Float::INFINITY
但是,如果您担心失去工作,则工作可能会失败并且不会通过设置删除:
Delayed::Worker.destroy_failed_jobs = false
您使用两者中的哪一个,或者如何混合它们取决于您。使用 Delayed::Job 使数据库更有意义,使用 ActiveJob 意味着该方法可以传输到其他实现。

关于ruby-on-rails - 如何让 Active Job 永远重试所有作业?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66305695/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com