2012-10-09 10 views
7
def perform 
    refund_log = { 
    success: refund_retry.success?, 
    amount: refund_amount, 
    action: "refund" 
    } 
    if refund_retry.success? 
    refund_log[:reference] = refund_retry.transaction.id 
    refund_log[:message] = refund_retry.transaction.status 
    else 
    refund_log[:message] = refund_retry.message 
    refund_log[:params] = {} 
    refund_retry.errors.each do |error| 
     refund_log[:params][error.code] = error.message 
    end 
    order_transaction.message = refund_log[:params].values.join('|') 
    raise "delayed RefundJob has failed" 
    end 
end 

else文で「delayed RefundJob has failed」を発生させると、Airbrakeが作成されます。 elseセクションで終了したら、もう一度ジョブを実行したいです。エラーが発生するたびにエアブレーキを作成する遅延ジョブ

例外を発生させずにジョブを再キューする方法はありますか?エアブレーキを作りたくないのですか?

私はdelayed_jobバージョン1.

答えて

0

を使用していますDelayedJobは、ジョブが定義によって、再キューイングするためにエラーが発生することを期待。

そこから、あなたのいずれかを実行できます。

、私はまだ第三のエアブレーキのレポートを埋める以降しようと、いくつかの機構を追加する助言、あなたはまだ何かが試みで満たされたログを持っていることの手間をかけずに間違っていることを検出することができます。

+0

徹底的な回答ありがとうございます。再スケジュール方法に関して、私の印象は、ジョブが失敗したときに再スケジューリングされるということです(エラーが発生していない場合は私のものが合格になります)。 –

2

最もクリーンな方法は、新しいジョブを作成してエンキューしてから通常どおりに終了することです。

+0

その問題は、新しいジョブがelseループで終了する可能性があるということです。つまり、3レベルのジョブを作成しなければならないということです。 –

+0

そうです。このアプローチの問題点は何ですか? – Roman

1

@ Romanのレスポンスで詳しく説明すると、retryパラメータを持つ新しいジョブを作成してエンキューできます。

retryパラメータを保持すると(ジョブを再エンキューするたびに増分されます)、再試行回数を追跡でき、無限の再試行ループを回避できます。

関連する問題