2009-08-14 12 views
5

私は喜んDelayedJobイディオムを使用している:HoptoadとDelayedJobとDaemonSpawnを統合するにはどうすればよいですか?

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 

答えて

0

デーモンには、作業中のレール環境が必要です。

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

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

デーモンは既にそれを実行しています(activerecordが必要です)が、遅延のジョブチャンスを実行するので、レールなしでdelay_jobを幸せにするには最小のアクティブレコードしか必要としません。

+0

良い答えだが、それが起動時にDJがいることをしますか。DJはscript/delayed_jobから始まり、次のコードを含みます: class DelayedJobWorker

1

Hoptoadは、Rails rescue_action_in_publicフックメソッドを使用して、例外を傍受してログに記録します。このメソッドは、リクエストがRailsコントローラによってディスパッチされたときにのみ実行されます。 このため、Hoptoadは、レーキタスクやレールスクリプト/ランナーなどで生成された例外を完全に認識していません。

Hoptoadに例外を追跡させたい場合は、手動で統合する必要があります。 これはかなり簡単です。次のコードは、Hoptoadはちょうどあなたの環境でHoptoadライブラリが含まれており、動作するはずnotify_hoptoad(exception)を呼び出す

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 

を呼び出される方法を示しています。あなたの環境がRailsコントローラの同じAPIを提供していることを確認するか、Hoptoadが不平を言うかもしれません。

3

遅延のソースをチェックアウト::仕事を...スニペットは次のようにあります:

# 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 
5

遅延::ワーカー#のhandle_failed_jobをmonkeypatching試してみてください。

# 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 

これは私のために働きました。

(Railsの3.0.10アプリでdelayed_job 2.1.4とhoptoad_notifier 2.4.11を使用して)

+0

バージョンを指定していただきありがとうございます! –

+1

'handle_failed_job_without_airbrake'はどこに定義されていますか?これを初めて知り、このパッチを理解しようとしています。私たちはすでにこのコードを持っていますが、私はhoptoad_notifier-2.4.11からairbrake_notifier-3.0.9にアップグレードしていますので、調整しています。 – Bradley

+2

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 – bonkydog

関連する問題