3

所以我在用户创建特定模型后使用 Delayed::Job 工作人员(在 Heroku 上)作为 after_create 回调。

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

当这种情况发生时,工人被解雇了,但是当他们查询手头的模型时,它已经被删除了,但是由于自动重试功能,这个命运多舛的工作将重试 25 次,并且绝对不会工作。

有什么方法可以捕获某些错误,并在它们发生时防止该特定作业再次重试,但如果不是那个错误,它将在未来重试?

4

2 回答 2

3

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

于 2010-08-05T06:22:25.027 回答
3

为了扩展大卫的答案,而不是这样做:

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
于 2011-01-06T19:52:42.810 回答