当使用像AirBrake或ExceptionNotifier这样的工具处理延迟作业时,获取错误报告的正确方法是什么?
我尝试创建自己的延迟作业类,但由Mailer.welcome()
(或类似方法)创建的邮件对象没有正确地序列化。我也尝试将error(job, exception)
方法添加到PerformableMailer
和PerformableMethod
类中,但我得到了更多与序列化相关的错误。我尝试了使用psych和sych进行序列化。
当使用像AirBrake或ExceptionNotifier这样的工具处理延迟作业时,获取错误报告的正确方法是什么?
我尝试创建自己的延迟作业类,但由Mailer.welcome()
(或类似方法)创建的邮件对象没有正确地序列化。我也尝试将error(job, exception)
方法添加到PerformableMailer
和PerformableMethod
类中,但我得到了更多与序列化相关的错误。我尝试了使用psych和sych进行序列化。
总体上,这个解决方案非常简单。如果你正在一个对象上执行延迟任务(比如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
# In <delayed-job-gem>/lib/delayed/performable_method.rb
module Delayed
class PerformableMethod
# line #7
delegate :method, :to => :object
首先,一个模块可用于邮件程序以及可能的其他延迟作业:
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)
Class
没有定义方法error
。
.../gems/delayed_job-3.0.5/lib/delayed/performable_method.rb:7:in `method' - pupeno