5

私は、DelayedJob イディオムを喜んで使用しています。

foo.send_later(:bar)

これは、DelayedJob プロセスでオブジェクト foo のメソッド bar を呼び出します。

そして、私はサーバー上で DelayedJob プロセスを開始するために DaemonSpawn を使用しています。

しかし... foo が例外をスローした場合、Hoptoad はそれをキャッチしません。

これは、これらのパッケージのいずれかのバグですか? それとも、いくつかの構成を変更する必要がありますか? それとも、Hoptoad 通知機能を呼び出す DS または DJ に例外処理を挿入する必要がありますか?


以下、最初のコメントへの返信です。

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

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

これは私にとってはうまくいきました。

(delayed_job 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_ENV = ARGV.first || ENV['RAILS_ENV'] || 'production'
require File.join('config', 'environment')

このようにして、デーモンが呼び出される環境を指定できます。

遅延ジョブを実行する可能性があるため、デーモンはすでにそれを実行しています(activerecordが必要です)が、レールなしでdelayed_jobを満足させるために最小限のactiverecordしか必要としないかもしれません。

于 2009-08-14T05:37:04.397 に答える