我有一个延迟的工作类别,负责在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
...