延迟的作业类自定义异常处理和重试

时间:2018-08-03 16:15:38

标签: ruby-on-rails delayed-job

我有一个延迟的工作类别,负责在active_record模型对象上调用搜索索引服务after_save。

如果索引作业失败,我想登录Airbrake(具有更好信息的异常通知服务)。

1)如果我不重新引发异常,则Delayed :: Job将静默失败,然后不重试。

2)如果我重新引发异常,那么Airbrake将获得两个异常实例,一个我称之为Airbrake,使用额外的模型和模型ID信息进行通知,另一个是我重新引发的异常以便允许Delayed :: Job重试。

有没有一种方法可以编写此自定义异常处理,以便我只得到一个详细的Airbrake,同时仍然有重试作业的时间?

class SearchReindexJob

  def initialize(active_record_object:, **options)
    @active_record_object = active_record_object
    @options = options
  end

  def perform
    @active_record_object.reindex
  rescue => e
    # Let airbrake know that search indexing is down
    Airbrake.notify(
      search_error_msg(e),
      model_name: @active_record_object.class.name,
      model_id: @active_record_object.id,
      exception: e,
      backtrace: e.backtrace
    )
    Rails.logger.fatal "Airbrake fired, Search indexing error for Model=#{@active_record_object.class} "\
                       "Id=#{@active_record_object.id}"
  end

...

0 个答案:

没有答案