Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 当您将一个对象传递给ActiveJob队列,而该对象在执行时不再存在时,会发生什么情况?_Ruby On Rails_Rails Activejob - Fatal编程技术网

Ruby on rails 当您将一个对象传递给ActiveJob队列,而该对象在执行时不再存在时,会发生什么情况?

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

如果要创建一个ActiveJob,并且执行块接受一个参数,该参数预期为ActiveRecord对象的单个实例,那么当作业排队时,有问题的对象存在,但在实际执行时该对象不再存在,作业显然会失败,对吗

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对象的原因)

这里提到: