【问题标题】:Delayed Job creating Airbrakes every time it raises an error每次引发错误时都会创建 Airbrakes 的延迟作业
【发布时间】:2012-09-30 01:43:33
【问题描述】:
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 部分结束,我想再次运行该作业。

有没有办法在不引发异常的情况下重新排队作业?并防止产生空气制动?

我正在使用延迟作业版本 1。

【问题讨论】:

    标签: ruby ruby-on-rails-3 delayed-job


    【解决方案1】:

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

    【讨论】:

    • 这样做的问题是新工作也可能最终进入 else 循环(就像 inception 一样),这意味着我必须创建一个 3 级工作,依此类推跨度>
    【解决方案2】:

    要详细说明@Roman 的响应,您可以创建一个新作业,其中包含retry 参数,然后将其加入队列。

    如果您维护retry 参数(每次重新排队作业时增加它),您可以跟踪您进行了多少次重试,从而避免无休止的重试循环。

    【讨论】:

      【解决方案3】:

      根据定义,DelayedJob 期望作业引发错误以重新排队。

      从那里你可以:

      关于后面的解决方案,我建议添加一些机制,在第三次或以后的尝试中仍会填写 airbrake 报告,您仍然可以检测到有问题,而无需为尝试填写日志而烦恼。

      【讨论】:

      • 感谢您的详尽回答。关于重新安排方法,我的印象是它会在作业失败时重新安排(如果我不提出错误,我的会通过。)我在这里正确吗?
      猜你喜欢
      • 2018-11-04
      • 2011-01-20
      • 1970-01-01
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-31
      相关资源
      最近更新 更多