Ruby on rails 当您将一个对象传递给ActiveJob队列,而该对象在执行时不再存在时,会发生什么情况?
如果要创建一个ActiveJob,并且执行块接受一个参数,该参数预期为ActiveRecord对象的单个实例,那么当作业排队时,有问题的对象存在,但在实际执行时该对象不再存在,作业显然会失败,对吗Ruby on rails 当您将一个对象传递给ActiveJob队列,而该对象在执行时不再存在时,会发生什么情况?,ruby-on-rails,rails-activejob,Ruby On Rails,Rails Activejob,如果要创建一个ActiveJob,并且执行块接受一个参数,该参数预期为ActiveRecord对象的单个实例,那么当作业排队时,有问题的对象存在,但在实际执行时该对象不再存在,作业显然会失败,对吗 MyJob < ActiveJob::Base def perform(widget) # do some stuff to widget end end MyJob
MyJob < ActiveJob::Base
def perform(widget)
# do some stuff to widget
end
end
MyJob
因此,一旦这个作业因为ActiveJob无法实例化原始ActiveRecord对象而失败,它就会继续失败。可以对作业进行哪些更新以停止故障循环。在执行之前,我考虑过挂接到,但我还没有看到前进的道路
除了解决手头的问题之外,我在这里学到的另一件事是传递widget\u id
整数比传递ActiveRecord对象更好。然后,我就可以从执行块中检查并查看有问题的小部件是否仍然存在。您可以查看当找不到对象时抛出的ActiveJob::反序列化错误。注意:这种反序列化发生在执行回调之前,这就是为什么可以使用执行回调来处理这种情况
因此,在作业类中,您可以添加:
class MyJob < ActiveJob::Base
rescue_from(ActiveJob::DeserializationError) do |exception|
# return true (we rescued) if the error causing the deserialization
# error was a record not being found
exception.original_exception == ActiveRecord::RecordNotFound
end
end
classmyjob
如果rescue\u from
返回true
,则表示错误已被处理,作业已成功完成。在本例中,我刚刚检查了导致反序列化错误的错误是否为ActiveRecord::RecordNotFound
(这是ActiveJob在找不到对象时用来序列化和反序列化ActiveRecord对象的原因) 这里提到: