Ruby on rails 3 发送带有延迟作业的电子邮件时出错报告
当使用AirBrake或ExceptionNotifier之类的工具邮寄延迟的作业时,获取错误报告的正确方法是什么Ruby on rails 3 发送带有延迟作业的电子邮件时出错报告,ruby-on-rails-3,delayed-job,error-reporting,airbrake,exception-notifier,Ruby On Rails 3,Delayed Job,Error Reporting,Airbrake,Exception Notifier,当使用AirBrake或ExceptionNotifier之类的工具邮寄延迟的作业时,获取错误报告的正确方法是什么 我试图创建自己的延迟作业类,但是由Mailer.welcome()(或类似)创建的邮件对象没有正确序列化。我还尝试向PerformableMailer和PerformableMethod类添加error(job,exception)方法,但我发现了更多与序列化相关的错误。我尝试了psych和sych进行序列化。首先,在mailer中包含一个模块,可能还有其他延迟作业: module
我试图创建自己的延迟作业类,但是由
Mailer.welcome()
(或类似)创建的邮件对象没有正确序列化。我还尝试向PerformableMailer
和PerformableMethod
类添加error(job,exception)
方法,但我发现了更多与序列化相关的错误。我尝试了psych和sych进行序列化。首先,在mailer中包含一个模块,可能还有其他延迟作业:
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)
更新的解决方案
总的来说,解决方案相当简单。如果您正在对对象执行延迟的任务(如MyClass.new.delay.some\u方法
),则需要将错误处理定义为对象方法。如果您正在类上执行延迟任务(如MyTestMailer.test\u email…
),则需要将错误处理定义为类方法
假设您有一个名为TestMailer
的邮件程序。解决方案是将错误处理定义为类方法,而不是对象方法:
现在,上面的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的例子中,目标对象不是对象,而是您的Mailer类TestMailer
。目标方法是您使用的邮件方法,例如test\u-mail
。DelayedJob查找目标对象上的所有挂钩(错误
,之前
,之后,等等)。但在我们的例子中,目标对象是类本身。因此,钩子必须定义为类方法
DelayedJob
处理ActionMailer邮件的方式有点老套。如果添加对象方法而不是类方法,则会引发不需要的异常。例如,下面是代码:
# In <delayed-job-gem>/lib/delayed/performable_method.rb
module Delayed
class PerformableMethod
# line #7
delegate :method, :to => :object
#In/lib/delayed/performable_method.rb
模块延迟
类执行方法
#第7行
委托:方法,:to=>:对象
ruby中的每个对象都有一个方法
函数,用于获取该类中方法的原始引用。但是在DelayedJob中,这个原始的方法
函数被委托给了其他一些目标对象。这种黑客行为使我们无法正常使用def error
功能来处理作业错误
编辑:添加脚注,次要澄清
编辑2:重新排序的答案当我试着这样做时,我得到了这样一个错误:类的未定义方法error'…/gems/delayed\u job-3.0.5/lib/delayed/performable\u方法。rb:7:“方法”中你试过类似的方法吗?已发布更新的解决方案,请检查?它最终变成了一个简单的类方法,而不是一个对象方法!非常感谢你!回答得很好。如果要跟踪所有作业上的错误,请参阅:
# In <delayed-job-gem>/lib/delayed/performable_method.rb
module Delayed
class PerformableMethod
# line #7
delegate :method, :to => :object