如何处理'记录不存在'错误并阻止后台作业尝试重试?

时间:2016-02-06 05:17:12

标签: ruby-on-rails error-handling rails-activejob

Rails应用程序有一个后台作业,可以调用服务对象,如下所示

class ObjectUpdateJob < ActiveJob::Base
  queue_as :default

  def perform(object_id)
    ObjectUpdater.call(object_id)
  end
end

class ObjectUpdater

  def self.call(*args)
    if @object = Object.find( args[:object_id] )
      #... update some stuff from external services 
    else 
      #... raise an error and prevent the background job from attempting to retry
    end
  end
end

这可能是一个简单的问题,但我对错误处理的经验是有限的,我很欣赏对此的第二个想法。

什么是&#39; Rails方式&#39;处理这个&#39;记录不存在&#39;案例,并确保通知后台工作,以便不尝试重试?

2 个答案:

答案 0 :(得分:1)

你可以在工作人员的class ObjectUpdateJob < ActiveJob::Base queue_as :default def perform(object_id) return unless Object.find(object_id) ObjectUpdater.call(object_id) end end 行动中加上一个保护条款:

ObjectUpdateJob.perform_now(object_id) if Object.find(object_id)

但为了获得更多保护,您可以对工作电话进行检查:

if(products!=null){
  for(int i=0; i<products.length; i++){
    if(products[i]!=null && product.getItemNum() < products[i].getItemNum()){
      index=i;
      temp = products[index];
      for(int j=products.length-1; j<=0; j--){
        products[j+1]= products[j];
      }
      products[index]= product;
    }
  }
}

这样你就不会让不存在的对象被处理。

答案 1 :(得分:0)

如果您使用Sidekiq,您可以将标记设置为:retry => false,以便作业不会自动重试。

此外,Sidekiq内置了错误处理机制。以下是有关此事的更多信息:https://github.com/mperham/sidekiq/wiki/Error-Handling

希望有所帮助。