使用delayed_job发送电子邮件时报告错误

pup*_*eno 10 error-reporting delayed-job ruby-on-rails-3 airbrake exception-notifier

当使用AirBrake或ExceptionNotifier等工具发送延迟的作业时,获取错误报告的正确方法是什么?

我试图创建自己的延迟作业类,但由Mailer.welcome()(或类似)创建的邮件对象未正确序列化.我也尝试error(job, exception)PerformableMailerPerformableMethod类中添加一个方法,但是我认为通常与序列化相关的错误更多.我为序列化尝试了psych和sych.

Sub*_*has 7

更新方案

总的来说,解决方案非常简单.如果您正在对Object(例如MyClass.new.delay.some_method)执行delayed_job ,则需要将错误处理定义为对象方法.如果您在(如MyTestMailer.test_email ...)上执行delayed_job ,则需要将错误处理定义为类方法.

假设你有一个叫做邮件的邮件TestMailer.解决方案是将错误处理定义为类方法,而不是对象方法:

# Your rails mailer
class TestMailer

  # Whoa! error has to be a class method!
  def self.error(job, e)
    puts "I can now handle test mailer errors in delayed job!!!!"
  end

end
Run Code Online (Sandbox Code Playgroud)

现在上面的def self.error方法将用作延迟作业中的错误回调!

或者,如果您希望能够处理所有操作邮件错误,

class ActionMailer::Base
  def self.error(job, e)
    puts "I can now handle all mailer errors in delayed job!!!"
  end
end
Run Code Online (Sandbox Code Playgroud)

原因是因为DelayedJob的内部PerformableMethod处理错误的方式.A PerformableMethod有两件事:目标对象和目标方法.在Action Mailer的情况下,目标对象不是对象,而是您的邮件程序类TestMailer.目标方法是您使用的邮件方法,比方说test_mail.DelayedJob查找所有的钩子(error,before,after等)的目标对象.但在我们的例子中,目标对象就是类本身.因此,钩子必须被定义为类方法.

DelayedJob处理ActionMailer邮件的方式有点hacky.如果添加对象方法而不是类方法,则会引发不需要的异常.例如,这是代码:

# In <delayed-job-gem>/lib/delayed/performable_method.rb
module Delayed
  class PerformableMethod

    # line #7
    delegate :method, :to => :object
Run Code Online (Sandbox Code Playgroud)

ruby中的每个对象都有一个method函数,用于获取该类中方法的原始引用.但是在DelayedJob中 - 这个原始method函数已被委托给其他一些目标对象.这个hack阻止我们正常使用该def error函数来处理作业错误.

编辑:添加脚注,轻微澄清

编辑2:重新排序的答案