1

我在 Rails 应用程序中使用延迟作业。每当延迟作业失败时,我想通知错误以进行空气烘烤。我在github上查看并了解了失败的方法。

我想将延迟作业失败的 last_error 属性发送到 airbrake。像这样的东西:

class ParanoidNewsletterJob < NewsletterJob
   def perform

   end

   def failure
     Airbrake.notify(:message => self.last_error, :error_class => self.handler)
   end
 end

但它给了我以下运行时错误:

undefined method `last_error' for #<struct ParanoidNewsletterJob>

请帮我弄清楚如何将延迟作业失败的 last_error 通知 Airbrake。

非常感谢!!

4

3 回答 3

0

您应该能够将作业传递给失败方法,然后从作业中提取 last_error。IE

def failure(job)
  Airbrake.notify(:message => job.last_error, :error_class => job.handler)
end
于 2013-06-18T12:04:38.840 回答
0

有两种方法可以实现您想要的:

  1. 一种特定于作业的方法,它仅适用于您想要的作业类型,方法是实现以作业为参数的失败方法。该作业将包含errorlast_error。这就是其他答案的意义所在。
  2. 一个全局选项,可以开发插件以将其应用于创建的任何作业类型。如果需要监视所有作业,则需要这样做。该插件可以注册并围绕作业生命周期中的各种事件执行操作。例如,如果我们想在存储到数据库之前对其进行处理,下面是一个更新 last_error 的插件

下面的一个例子:

require 'delayed_job'

class ErrorDelayedJobPlugin < Delayed::Plugin
  def self.update_last_error(event, job)
    begin
      unless job.last_error.nil?
        job.last_error = job.last_error.gsub("\u0000", '')  # Replace null byte
        job.last_error = job.last_error.encode('UTF-8', invalid: :replace, undef: :replace, replace: '')
      end
    rescue => e
    end
  end

  callbacks do |lifecycle|
    lifecycle.around(:failure) do |worker, job, *args, &block|
      update_last_error(:around_failure, job)
      block.call(worker, job)
    end
  end
end

基本上,当任何作业发生任何故障时都会调用它。有关此回调如何工作的详细信息,您可以参考A plugin to update last_error in Delayed Job

于 2017-11-19T04:04:14.947 回答
0

这应该可以正常工作

def failure(job)
 Airbrake.notify(:message => job.error, :error_class => job.error.class, :backtrace => job.error.backtrace)
end
于 2017-10-02T12:14:29.070 回答