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

标签 ruby-on-rails ruby-on-rails-6 rails-activejob

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

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/

相关文章:

ruby-on-rails - 如何在 Rails 中将两个 Controller 与一个模型一起使用

javascript - Ruby on Rails 检查是否启用了 javascript

ruby-on-rails - ActionController::InvalidAuthenticityToken 在登录时使用 NGINX 和 Rails

ruby-on-rails - “此锁文件必须使用Bundler 2或更高版本。”即使安装了Bundler 2.0.2

ruby-on-rails - 禁用 ActiveJob 自动重试,与 Sidekiq 一起使用

ruby-on-rails - ActiveJob 自定义序列化程序 - 未初始化的常量 NameError

ruby-on-rails - 翻译缺少activeadmin,Ruby on Rails

javascript - Rails Javascript 使用 Controller 中的数组进行解析

ruby-on-rails - Webpacker::Manifest::MissingEntryError 与普通 Rails 6 应用程序

ruby-on-rails - 事件作业 : start a job automatically when starting server