如何将Hoptoad与DelayedJob和DaemonSpawn集成?

5 ruby ruby-on-rails hoptoad

我一直很高兴使用DelayedJob成语:

foo.send_later(:bar)
Run Code Online (Sandbox Code Playgroud)

这将调用DelayedJob进程中对象foo上的方法栏.

我一直在使用DaemonSpawn在我的服务器上启动DelayedJob进程.

但是......如果foo抛出异常,Hoptoad就无法捕获它.

这是否是任何这些软件包中的错误...或者我是否需要更改某些配置...或者我是否需要在DS或DJ中插入一些将调用Hoptoad通知程序的异常处理?


回应下面的第一条评论.

class DelayedJobWorker < DaemonSpawn::Base
def start(args)
  ENV['RAILS_ENV'] ||= args.first || 'development'
  Dir.chdir RAILS_ROOT
  require File.join('config', 'environment')

  Delayed::Worker.new.start
end
Run Code Online (Sandbox Code Playgroud)

bon*_*dog 5

尝试monkeypatching Delayed :: Worker#handle_failed_job:

# lib/delayed_job_airbrake.rb

module Delayed
  class Worker

    protected

    def handle_failed_job_with_airbrake(job, error)
      say "Delayed job failed -- logging to Airbrake"
      HoptoadNotifier.notify(error)
      handle_failed_job_without_airbrake(job, error)
    end

    alias_method_chain :handle_failed_job, :airbrake

  end
end
Run Code Online (Sandbox Code Playgroud)

这对我有用.

(在使用delayed_job 2.1.4和hoptoad_notifier 2.4.11的Rails 3.0.10应用程序中)

  • 它是由alias_method_chain中的元编程创建的.当你说"alias_method_chain:handle_failed_job,:airbrake"时,alias_method_chain基本上将"handle_failed_job"重命名为"handle_failed_job_without_airbrake"并将"handle_failed_job_with_airbrake"重命名为handle_failed_job.这使您可以包装原始实现并在之前或之后执行操作.如果你很好奇,请查看代码:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/module/aliasing.rb (2认同)

Max*_*yak 0

只是把它扔在那里 - 你的守护进程应该需要你正在处理的 Rails 环境。它看起来应该类似于:

RAILS_ENV = ARGV.first || ENV['RAILS_ENV'] || 'production'
require File.join('config', 'environment')
Run Code Online (Sandbox Code Playgroud)

这样你就可以指定守护进程被调用的环境。

因为它运行延迟作业,所以守护进程已经这样做了(它需要 activerecord),但也许您只需要最少的 activerecord 即可在没有rails的情况下使delayed_job满意。