5

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

foo.send_later(:bar)

这会在 DelayedJob 进程中调用对象 foo 上的方法 bar。

我一直在使用 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
4

4 回答 4

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

这对我有用。

(在使用延迟作业 2.1.4 和 hoptoad_notifier 2.4.11 的 Rails 3.0.10 应用程序中)

于 2011-08-24T04:56:06.700 回答
3

查看 Delayed::Job 的来源...有一个片段,如:

# This is a good hook if you need to report job processing errors in additional or different ways
def log_exception(error)
  logger.error "* [JOB] #{name} failed with #{error.class.name}: #{error.message} - #{attempts} failed attempts"
  logger.error(error)
end

我还没有尝试过,但我认为您可以执行以下操作:

class Delayed::Job
  def log_exception_with_hoptoad(error)
    log_exception_without_hoptoad(error)
    HoptoadNotifier.notify(error)
  end

  alias_method_chain :log_exception, :hoptoad
end
于 2009-09-14T17:55:05.040 回答
1

Hoptoad 使用 Railsrescue_action_in_public钩子方法来拦截异常并记录它们。此方法仅在请求由 Rails 控制器分派时执行。出于这个原因,Hoptoad 完全不知道任何异常生成,例如,rake 任务或 rails 脚本/运行程序。

如果你想让 Hoptoad 跟踪你的异常,你应该手动集成它。它应该很简单。以下代码片段演示了如何调用 Hoptoad

def rescue_action_in_public_with_hoptoad exception
  notify_hoptoad(exception) unless ignore?(exception) || ignore_user_agent?
  rescue_action_in_public_without_hoptoad(exception)
end

只需在您的环境中包含 Hoptoad 库,调用即可notify_hoptoad(exception)。确保您的环境提供与 Rails 控制器相同的 API,否则 Hoptoad 可能会抱怨。

于 2009-08-18T13:14:21.683 回答
0

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

RAILS_ENV = ARGV.first || ENV['RAILS_ENV'] || 'production'
require File.join('config', 'environment')

这样,您可以指定调用守护程序的环境。

由于它运行延迟作业的机会是守护进程已经这样做了(它需要activerecord),但也许你只需要最少的activerecord就可以让delayed_job在没有rails的情况下快乐。

于 2009-08-14T05:37:04.397 回答