使用与Sidekiq一起使用的ActiveJob禁用自动重试

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)

  • 实际上,您可以删除`RetryJobs`中间件[如此处](https://github.com/mperham/sidekiq/wiki/Middleware#default-middleware) (4认同)
  • Sidekiq有一种内置的方式来关闭全局重试:`Sidekiq.default_worker_options = {retry:0} (4认同)
  • @Ari 我不相信这对 ActiveJob 有效......只适用于没有 AJ 的本地 Sidekiq 工人 (2认同)

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或更高版本。


ilg*_*gam 7

您可以捕获异常并且什么都不做,而是重试或配置重试:

  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 集成进行重试


Mik*_*ham 6

无法使用ActiveJob配置有关Sidekiq的任何内容。如果您不想使用默认值,请使用Sidekiq Worker。

  • 即使我们使用初始化程序,其设置也如下?Sidekiq.default_worker_options = {'backtrace'=&gt; 5,'retry'=&gt; 3} (2认同)