所以我在用户创建特定模型后使用 Delayed::Job 工作人员(在 Heroku 上)作为 after_create 回调。
然而,事实证明,一个常见的用例是用户创建一些东西,然后立即删除它(可能是因为他们犯了错误或其他什么)。
当这种情况发生时,工人被解雇了,但是当他们查询手头的模型时,它已经被删除了,但是由于自动重试功能,这个命运多舛的工作将重试 25 次,并且绝对不会工作。
有什么方法可以捕获某些错误,并在它们发生时防止该特定作业再次重试,但如果不是那个错误,它将在未来重试?
所以我在用户创建特定模型后使用 Delayed::Job 工作人员(在 Heroku 上)作为 after_create 回调。
然而,事实证明,一个常见的用例是用户创建一些东西,然后立即删除它(可能是因为他们犯了错误或其他什么)。
当这种情况发生时,工人被解雇了,但是当他们查询手头的模型时,它已经被删除了,但是由于自动重试功能,这个命运多舛的工作将重试 25 次,并且绝对不会工作。
有什么方法可以捕获某些错误,并在它们发生时防止该特定作业再次重试,但如果不是那个错误,它将在未来重试?
将检查抽象到您使用延迟作业调用的函数中。进行相关检查,以确定您想要的工作是否可以继续进行,或者从事该工作或返回成功。
为了扩展大卫的答案,而不是这样做:
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