ruby ActiveJob retry_on回调被忽略

ej83mcc0  于 12个月前  发布在  Ruby
关注(0)|答案(2)|浏览(147)

我正在运行Rails 5.1,Ruby 2.5,Sidekiq。我已经设置了一个简单的用例:

class RetryJobException < Exception

end

class CustomJob < ActiveJob::Base

    retry_on RetryJobException, wait: 3.seconds, attempts: 2 do
        puts "RETRYING"
    end

    def perform(*args)
        raise RetryJobException
    end
end

字符串
这里发生的是,当我运行这个作业并引发RetryJobException时,CustomJob会在30秒后重新运行(而不是三次......),不确定次数(而不是2次),直到我杀死Sidekiq的进程。“RETRYING”从未打印在任何地方,这表明retry_on块中的代码从未执行过。
根据documentation,这应该是一个基本的用例,然而,我遇到了这些问题。我做错了什么?

hxzsmxv2

hxzsmxv21#

这对我很有效:

class RetryJobException < Exception

end

class UnprocessableJob < StandardError; end

class CustomJob < ActiveJob::Base

    retry_on RetryJobException, wait: 3.seconds, attempts: 2 do
        puts "RETRYING"
        before_perform { raise UnprocessableJob }
    end

    discard_on UnprocessableJob

    def perform(*args)
        raise RetryJobException
    end
end

字符串

xpcnnkqh

xpcnnkqh2#

仔细阅读文档后,我发现:
您还可以传递一个块,如果自定义逻辑的重试尝试失败,而不是让异常冒泡,则将调用该块。该块以作业示例作为第一个参数,错误示例作为第二个参数产生。
retry_on允许在重试尝试用尽后传递一个块来处理异常。
我的方案是在作业失败时通知我,rescue_from似乎解决了我的问题

module LoggableJob
  extend ActiveSupport::Concern

  included do
    rescue_from(StandardError) do |exception|
      ExceptionNotifier.notify_exception(exception, data: job_exception_data)
      AppLog.exception(exception, self, data: job_exception_data)

      # https://apidock.com/rails/v5.0.0.1/ActiveJob/Enqueuing/retry_job
      retry_job wait: 5.minutes, priority: 5
    end
  end

  def job_exception_data
    { queue_name: queue_name, args: arguments, job_id: job_id}
  end
end

字符串

相关问题