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;案例,并确保通知后台工作,以便不尝试重试?
答案 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
希望有所帮助。