ruby-on-rails-3 - 使用延迟作业发送电子邮件时报告错误

标签 ruby-on-rails-3 delayed-job error-reporting airbrake exception-notifier

使用 AirBrake 或 ExceptionNotifier 等工具从邮寄延迟的作业中获取错误报告的正确方法是什么?

我试图创建自己的延迟作业类,但 Mailer.welcome() 创建的邮件对象(或类似的)没有正确序列化。我还尝试添加 error(job, exception) PerformableMailer 的方法和 PerformableMethod类,但我相信我得到了更多通常与序列化相关的错误。我尝试了 psych 和 sych 来进行连载。

最佳答案

更新的解决方案

总的来说,解决方案非常简单。如果您正在对对象执行延迟作业(如 MyClass.new.delay.some_method ),那么您需要将错误处理定义为对象方法。如果您在 Class 上执行延迟作业(如 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 查找目标对象上的所有 Hook (errorbeforeafter 等)。但在我们的例子中,目标对象就是类本身。因此,钩子(Hook)必须定义为类方法。

一路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功能已被委托(delegate)给其他一些目标对象。此 hack 使我们无法正常使用 def error处理作业错误的函数。

编辑:添加脚注,次要澄清

编辑2:重新排序的答案

关于ruby-on-rails-3 - 使用延迟作业发送电子邮件时报告错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11766368/

相关文章:

PHP 不显示错误 - 内部服务器错误 (500)

javascript - 如何 jQuery Ajax 错误捕获和报告

ruby-on-rails - ActionDispatch::ShowExceptions - Rails 升级 2.3.x 到 3.2.x

jquery - 如何使用从 json 上传的 jquery 文件自定义服务器响应

java - 非阻塞延迟队列,Java

ruby-on-rails - 与 rails 3 一起使用的作业队列替代方案?

ruby-on-rails-3 - 在其他 Controller 中出现错误后,rails 渲染表单

ruby-on-rails - Ruby on Rails 中多对多的正确实现?

ruby-on-rails - Capistrano 有多个 delayed_jobs 角色?

java - 流行的 JSP/Servlet/Portlet 错误日志查看器?