Jul*_*nic 19 ruby-on-rails sidekiq rails-activejob
有没有办法禁用ActiveJob和Sidekiq的自动重试?
我知道只有Sidekiq,我们只需要放
sidekiq_options :retry => false
Run Code Online (Sandbox Code Playgroud)
如上所述:https://github.com/mperham/sidekiq/wiki/Error-Handling#configuration
但它似乎不适用于ActiveJob和Sidekiq.
我也知道这里提出的重新启用重试的解决方案:https://stackoverflow.com/a/28216822/2431728
但这不是我需要的行为.
Jul*_*nic 17
好的,谢谢你的回答.
仅供参考,我还在与此主题相关的ActiveJob Github问题中提出了问题:https://github.com/rails/activejob/issues/47
DHH回答我一个我没有测试但可以完成这项工作的解决方案.
个人而言,我最终把它放在一个初始化器中,以便在全局禁用Sidekiq重试,它运行良好:
Sidekiq.configure_server do |config|
config.server_middleware do |chain|
chain.add Sidekiq::Middleware::Server::RetryJobs, :max_retries => 0
end
end
Run Code Online (Sandbox Code Playgroud)
han*_*mar 13
从 开始sidekiq 6.0.1,可以将以下内容传递给 ActiveJob 工作器以防止其重试:
class ExampleJob < ActiveJob::Base
sidekiq_options retry: false
def perform(*args)
# Perform Job
end
end
Run Code Online (Sandbox Code Playgroud)
更多信息:https : //github.com/mperham/sidekiq/wiki/Active-Job#customizing-error-handling
编辑:
据此,这也需要 Rails6.0.1或更高版本。
您可以捕获异常并且什么都不做,而是重试或配置重试:
class ExampleJob < ActiveJob::Base
rescue_from(StandardError) do |exception|
Rails.logger.error "[#{self.class.name}] Hey, something was wrong with you job #{exception.to_s}"
end
def perform
raise StandardError, "error_message"
end
end
class ExampleJob < ActiveJob::Base
rescue_from(StandardError) do |exception|
retry_job wait: 5.minutes, queue: :low_priority
end
def perform
raise StandardError, "error_message"
end
end
Run Code Online (Sandbox Code Playgroud)
要运行重试,您可以使用 retry_on 方法retry_on 方法文档
Sidekiq wiki,用于通过 Active Job 集成进行重试
无法使用ActiveJob配置有关Sidekiq的任何内容。如果您不想使用默认值,请使用Sidekiq Worker。
| 归档时间: |
|
| 查看次数: |
11872 次 |
| 最近记录: |