pup*_*eno 10 error-reporting delayed-job ruby-on-rails-3 airbrake exception-notifier
当使用AirBrake或ExceptionNotifier等工具发送延迟的作业时,获取错误报告的正确方法是什么?
我试图创建自己的延迟作业类,但由Mailer.welcome()(或类似)创建的邮件对象未正确序列化.我也尝试error(job, exception)在PerformableMailer和PerformableMethod类中添加一个方法,但是我认为通常与序列化相关的错误更多.我为序列化尝试了psych和sych.
总的来说,解决方案非常简单.如果您正在对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:重新排序的答案
| 归档时间: |
|
| 查看次数: |
1400 次 |
| 最近记录: |