我希望ExceptionNotifier在延迟工作中发生异常时发送电子邮件,就像其他异常一样。我该如何实现?
最佳答案
我使用Rails 3.2.6,delayed_job 3.0.3和exception_notification 2.6.1 gem进行此操作
# In config/environments/production.rb or config/initializers/delayed_job.rb
# Optional but recommended for less future surprises.
# Fail at startup if method does not exist instead of later in a background job
[[ExceptionNotifier::Notifier, :background_exception_notification]].each do |object, method_name|
raise NoMethodError, "undefined method `#{method_name}' for #{object.inspect}" unless object.respond_to?(method_name, true)
end
# Chain delayed job's handle_failed_job method to do exception notification
Delayed::Worker.class_eval do
def handle_failed_job_with_notification(job, error)
handle_failed_job_without_notification(job, error)
# only actually send mail in production
if Rails.env.production?
# rescue if ExceptionNotifier fails for some reason
begin
ExceptionNotifier::Notifier.background_exception_notification(error)
rescue Exception => e
Rails.logger.error "ExceptionNotifier failed: #{e.class.name}: #{e.message}"
e.backtrace.each do |f|
Rails.logger.error " #{f}"
end
Rails.logger.flush
end
end
end
alias_method_chain :handle_failed_job, :notification
end
在所有环境中加载此代码可能是一个好主意,以便在更新包等之后捕获错误,然后再将它们投入生产。我通过创建一个
config/initializers/delayed_job.rb
文件来完成此操作,但是您可以为每个config/environments/*
环境复制该代码。另一个技巧是将延迟的作业配置调整为默认值,当作业失败时,您可能会收到很多重复的异常邮件。
# In config/initializers/delayed_job_config.rb
Delayed::Worker.max_attempts = 3
更新我的
delayed_job
守护程序无提示退出时遇到了一些问题,结果是ExceptionNotifier
无法发送邮件并且没有人救出该异常。现在,代码将挽救并记录下来。