Sidekiq瞬态vs致命错误

问题描述:

有没有办法从Sidekiq作业中错误地告诉Sidekiq“这个错误是致命的,不可恢复的,不要重试,直接发送到死的作业队列”?Sidekiq瞬态vs致命错误

查看Sidekiq Error Handling文档,它似乎将所有错误解释为暂时性的,并且将重试作业(如果重试已启用),而不考虑错误类型。

+0

也许在回答[这](https://github.com/mperham/sidekiq/issues/2072)问题可以帮助你? –

+0

@JeroenHeier关于你链接的问题的意见之一正是我想要的:https://github.com/mperham/sidekiq/issues/2072#issuecomment-160832087 – mtulio

+0

@JeroenHeier你会介意发布它是一个答案,所以我可以将其标记为已接受? – mtulio

如果在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做的方法。我敢肯定,迈克·佩勒姆将要来到这里并大声喝斥我要表明这一点,但...

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

不幸的是,这不会发送消息到Dead Job Queue,这是我想要的“致命”错误的工作流程的重要部分。 – mtulio