2017-02-13 13 views
1

Sidekiqジョブからエラーが発生する方法はありますか?Sidekiqに「このエラーは致命的で回復不可能です。再試行しないで、直ちにデッドジョブキューに送信してください」と伝えますか?Sidekiq transientと致命的なエラー

文書を見ると、すべてのエラーが一時的であると解釈され、エラータイプに関係なくジョブを再試行します(再試行が有効な場合)。

+0

多分答えを[この](https://github.com/mperham/sidekiq/issues/2072)問題はあなたを助けることができますか? –

+0

@JeroenHeierあなたがリンクしている問題に関するコメントの1つは、私が欲しいものです。https://github.com/mperham/sidekiq/issues/2072#issuecomment-160832087 – mtulio

+0

@JeroenHeier投稿していただければ幸いですか?私はそれをAcceptedとしてマークすることができますか? – mtulio

答えて

0

見つかった場合はGitHubあなたの問題の解決策を示します。その記事では、再試行を防ぐために例外を処理するカスタムミドルウェアを作成するように提案しました。これは基本的な例である:

def call(worker, msg, queue) 
    begin 
    yield 
    rescue ActiveRecord::RecordNotFound => e 
    msg['retry'] = false 
    raise 
    end 
end 

あなたはあなたが得ることを拡張することができます上の

def call(worker, msg, queue) 
    begin 
    yield 
    rescue ActiveRecord::RecordNotFound => e 
    msg['retry'] = false 
    raise 
    rescue Exception => e 
    if worker.respond_to?(:handle_error) 
     worker.handle_error(e) 
    else 
     raise 
    end 
    end 
end 
3

これらの特定のエラーを救済し、再発生しないようにしてください。

def perform 
    call_something 
rescue CustomException 
    nil 
end 

編集:

さて、あなたは意図的DLQ/DJQにメッセージを送信したい場合、あなたは#send_to_morgueが何をするかないメソッドを作成する必要があると思います。私はマイクPerhamのは、ここに来て、このことを示唆するために私に叫ぶために起こっていると確信していますが...

def send_to_morgue(msg) 
     Sidekiq.logger.info { "Adding dead #{msg['class']} job #{msg['jid']}" } 
     payload = Sidekiq.dump_json(msg) 
     now = Time.now.to_f 
     Sidekiq.redis do |conn| 
     conn.multi do 
      conn.zadd('dead', now, payload) 
      conn.zremrangebyscore('dead', '-inf', now - DeadSet.timeout) 
      conn.zremrangebyrank('dead', 0, -DeadSet.max_jobs) 
     end 
     end 
    end 

あなたがそのメソッドに入ってどのように見えるかmsgに掘る必要があるだろう唯一の違いが、私パースする前にミドルウェアにヒットしていると思われる。

+0

'nil'は冗長です:) – mudasobwa

+0

@mudasobwaは合意しましたが、私はそれを明示的に指定します – Anthony

+0

残念ながら、これはデッドジョブキューにメッセージを送信しません。これは、「致命的な」エラーが発生するワークフローの重要な部分です。 – mtulio