10

AirBrakeやExceptionNotifierなどのツールを使用して遅延ジョブをメール送信する場合にエラーレポートを取得する適切な方法は何ですか?

独自の遅延ジョブクラスを作成しようとしましたが、Mailer.welcome()(または同様の)によって作成されたメールオブジェクトが正しくシリアル化されていません。また、クラスとクラスにerror(job, exception)メソッドを追加しようとしましたが、一般的にシリアル化に関連するエラーが増えたと思います。シリアル化のためにpsychとsychの両方を試しました。PerformableMailerPerformableMethod

4

2 に答える 2

7

更新されたソリューション

全体的に、解決策は非常に簡単です。オブジェクト(など)でdelayed_jobを実行している場合は、MyClass.new.delay.some_methodエラー処理をオブジェクトメソッドとして定義する必要があります。(のような)クラスでdelayed_jobを実行している場合はMyTestMailer.test_email ...、エラー処理をクラスメソッドとして定義する必要があります。

と呼ばれるメーラーがあるとしましょうTestMailer解決策は、エラー処理をオブジェクトメソッドではなくクラスメソッドとして定義することです。

# Your rails mailer
class TestMailer

  # Whoa! error has to be a class method!
  def self.error(job, e)
    puts "I can now handle test mailer errors in delayed job!!!!"
  end

end

これで、上記のdef self.errorメソッドが遅延ジョブのエラーコールバックとして使用されます。

または、すべてのアクションメーラーエラーを処理できるようにしたい場合は、

class ActionMailer::Base
  def self.error(job, e)
    puts "I can now handle all mailer errors in delayed job!!!"
  end
end

その理由は、DelayedJobの内部PerformableMethodがエラーを処理する方法が原因です。APerformableMethodには、ターゲットオブジェクトとターゲットメソッドの2つがあります。Action Mailerの場合、ターゲットオブジェクトはオブジェクトではなく、メーラークラスTestMailerです。ターゲットメソッドは、使用するメールメソッドですtest_mail。DelayedJobは、ターゲットオブジェクト上のすべてのフック(、、、など)をerror検索します。しかし、私たちの場合、ターゲットオブジェクトはクラス自体です。したがって、フックはクラスメソッドとして定義する必要があります。beforeafter

ActionMailerメールを処理する方法DelayedJobは少しハッキーです。クラスメソッドの代わりにオブジェクトメソッドを追加すると、不要な例外がスローされます。たとえば、コードは次のとおりです。

# In <delayed-job-gem>/lib/delayed/performable_method.rb
module Delayed
  class PerformableMethod

    # line #7
    delegate :method, :to => :object

rubyのすべてのオブジェクトには、methodそのクラス内のメソッドへの生の参照を取得するために使用される関数があります。しかし、DelayedJobでは、このrawmethod関数は他のターゲットオブジェクトに委任されています。このハックにより、def errorジョブエラーを処理するための関数を通常は使用できなくなります。

編集:脚注を追加、マイナーな説明

編集2:並べ替えられた回答

于 2013-06-10T17:19:20.563 に答える
2

まず、メーラーおよび場合によっては他の遅延ジョブに含めるためのモジュール:

module Delayed
  module Airbrake
    # Send error via Airbrake
    def error(job, e)
      ::Airbrake.notify(e, :component => job.name, :action => 'perform', :parameters => {:job => job.inspect})
    end
 end

終わり

次にそれを含めます:

Delayed::PerformableMailer.send(:include, Delayed::Airbrake)
于 2012-10-06T16:43:33.723 に答える