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

11

当使用像AirBrake或ExceptionNotifier这样的工具处理延迟作业时,获取错误报告的正确方法是什么?

我尝试创建自己的延迟作业类,但由Mailer.welcome()(或类似方法)创建的邮件对象没有正确地序列化。我也尝试将error(job, exception)方法添加到PerformableMailerPerformableMethod类中,但我得到了更多与序列化相关的错误。我尝试了使用psych和sych进行序列化。


你有尝试过类似这样的方式吗?https://dev59.com/1Wcs5IYBdhLWcg3wp1lW - Joseph Myers
发布了更新的解决方案,请您检查一下?最终结果是一个简单的类方法而不是对象方法。 - Subhas
2个回答

8

更新的解决方案

总体上,这个解决方案非常简单。如果你正在一个对象上执行延迟任务(比如MyClass.new.delay.some_method),那么你需要将错误处理定义为一个对象方法。如果你在一个上执行延迟任务(比如MyTestMailer.test_email ...),那么你需要将错误处理定义为一个类方法。

假设你有一个名为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

现在,上述的def self.error方法将被用作延迟工作中的错误回调函数!
或者,如果您想要能够处理所有操作邮件错误,
class ActionMailer::Base
  def self.error(job, e)
    puts "I can now handle all mailer errors in delayed job!!!"
  end
end

由于DelayedJob内部的PerformableMethod处理错误的方式,导致了这个问题。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

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

太棒了!非常感谢你! - pupeno
很棒的答案。如果您想跟踪所有作业中的错误,请参见:https://dev59.com/1Wcs5IYBdhLWcg3wp1lW#14172132 - monozok

2

首先,一个模块可用于邮件程序以及可能的其他延迟作业:

module Delayed
  module Airbrake
    # Send error via Airbrake
    def error(job, e)
      ::Airbrake.notify(e, :component => job.name, :action => 'perform', :parameters => {:job => job.inspect})
    end
 end

然后将其包含:

Delayed::PerformableMailer.send(:include, Delayed::Airbrake)

1
当我尝试这个时,出现了这个错误:类Class没有定义方法error。 .../gems/delayed_job-3.0.5/lib/delayed/performable_method.rb:7:in `method' - pupeno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接