Ruby on rails 对延迟的工作人员进行更高级的控制重试

Ruby on rails 对延迟的工作人员进行更高级的控制重试,ruby-on-rails,ruby,delayed-job,Ruby On Rails,Ruby,Delayed Job,所以我使用Delayed::Job workers(在Heroku上)作为用户创建特定模型后的创建后回调 然而,事实证明,一个常见的用例是用户创建一些东西,然后立即删除它(可能是因为他们犯了错误或其他什么) 当这种情况发生时,工作人员会兴奋起来,但是当他们查询手头的模型时,它已经被删除了,但是由于自动重试功能,这个命运多舛的作业将重试25次,而且肯定永远不会工作 是否有任何方法可以捕获某些错误,并在它们发生时阻止特定作业再次重试,但如果不是该错误,它将在将来重试?将检查抽象到使用延迟作业调用的函

所以我使用Delayed::Job workers(在Heroku上)作为用户创建特定模型后的创建后回调

然而,事实证明,一个常见的用例是用户创建一些东西,然后立即删除它(可能是因为他们犯了错误或其他什么)

当这种情况发生时,工作人员会兴奋起来,但是当他们查询手头的模型时,它已经被删除了,但是由于自动重试功能,这个命运多舛的作业将重试25次,而且肯定永远不会工作


是否有任何方法可以捕获某些错误,并在它们发生时阻止特定作业再次重试,但如果不是该错误,它将在将来重试?

将检查抽象到使用延迟作业调用的函数中。对你想要的工作是否可以继续进行进行相关的检查,并对该工作进行检查或返回成功。

要详细说明David的答案,请不要这样做:

def after_create
   self.send_later :spam_this_user
end
我会这样做:

# user.rb

def after_create
   Delayed::Job.enqueue SendWelcomeEmailJob.new(self.id)
end

# send_welcome_email_job.rb

class SendWelcomeEmailJob <  Struct(:user_id)
   def perform
      user = User.find_by_id(self.user_id)
      return if user.nil?  #user must have been deleted

      # do stuff with user
   end
end
#user.rb
创建后定义
延迟::Job.enqueue SendWelcomeEmailJob.new(self.id)
结束
#发送\u欢迎\u电子邮件\u job.rb
类SendWelcomeEmailJob
但这与他们可爱的无影响设计相比实在是太可怕了:)我想另一个真正的问题是——这25次失败真的会导致问题吗?作业应该能够适应错误并重新运行。如果不是这样,那么您应该a)重新考虑延迟作业的设计,或者b)确保作业了解它可以“处理”哪些错误,并采取适当的措施。可能是静默退出,以避免导致重新运行的错误。