每次产生错误时延迟创建Airbrakes作业

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语句中提出“延迟的RefundJob失败”时,它会创建一个Airbrake。 如果它在else部分结束,我想再次运行该作业。

有什么方法可以在不引发异常的情况下重新排列工作? 并防止创建一个airbrake?

我正在使用delayed_job版本1。


最简洁的方法是重新排队,即创建一个新的作业并入队,然后正常退出该方法。


为了详细说明@ Roman的回复,您可以创建一个新的作业,并在其中添加一个retry参数,并将其排入队列。

如果您维护retry参数(每次重新入列作业都增加retry参数),则可以跟踪您所做的重试次数,从而避免无尽的重试循环。


根据定义,DelayedJob希望一份工作能够提出一个要重新排序的错误。

从那里你可以:

  • 忽略您在airbrake上的执行情况,请参阅https://github.com/airbrake/airbrake#filtering,以便它可以在不填充日志的情况下再次排队
  • 潜入DelayedJob代码,您可以在https://github.com/tobi/delayed_job/blob/master/lib/delayed/job.rb#L65上看到名为reschedule的方法可用,并由run_with_lock (https:// github.com/tobi/delayed_job/blob/master/lib/delayed/job.rb#L99)。 从那里你可以调用手动重新安排它,而不是提高你的例外。
  • 关于后面的解决方案,我建议在第三次或以后的尝试中添加一些仍然填充空气制动报告的机制,但如果没有尝试填充日志的麻烦,仍然可以检测到有问题。

    链接地址: http://www.djcxy.com/p/11273.html

    上一篇: Delayed Job creating Airbrakes every time it raises an error

    下一篇: paren `( ... ) macro