Sidekiqジョブからエラーが発生する方法はありますか?Sidekiqに「このエラーは致命的で回復不可能です。再試行しないで、直ちにデッドジョブキューに送信してください」と伝えますか?Sidekiq transientと致命的なエラー
文書を見ると、すべてのエラーが一時的であると解釈され、エラータイプに関係なくジョブを再試行します(再試行が有効な場合)。
Sidekiqジョブからエラーが発生する方法はありますか?Sidekiqに「このエラーは致命的で回復不可能です。再試行しないで、直ちにデッドジョブキューに送信してください」と伝えますか?Sidekiq transientと致命的なエラー
文書を見ると、すべてのエラーが一時的であると解釈され、エラータイプに関係なくジョブを再試行します(再試行が有効な場合)。
見つかった場合は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
これらの特定のエラーを救済し、再発生しないようにしてください。
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
に掘る必要があるだろう唯一の違いが、私パースする前にミドルウェアにヒットしていると思われる。
多分答えを[この](https://github.com/mperham/sidekiq/issues/2072)問題はあなたを助けることができますか? –
@JeroenHeierあなたがリンクしている問題に関するコメントの1つは、私が欲しいものです。https://github.com/mperham/sidekiq/issues/2072#issuecomment-160832087 – mtulio
@JeroenHeier投稿していただければ幸いですか?私はそれをAcceptedとしてマークすることができますか? – mtulio