gpt4 book ai didi

ruby-on-rails - 当您将一个对象传递给 ActiveJob 入队并且该对象在执行时不再存在时会发生什么?

转载 作者:行者123 更新时间:2023-12-03 15:56:49 24 4
gpt4 key购买 nike

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

MyJob < ActiveJob::Base
def perform(widget)
# do some stuff to widget
end
end

所以一旦这个作业因为 ActiveJob 无法实例化原始的 ActiveRecord 对象而失败,它将继续失败。可以对作业进行哪些更新以停止故障循环。我考虑过 Hook before_perform ,但我还没有看到前进的道路。

除了解决手头的问题之外,我在这里学到的另一件事是通过 widget_id 会更好。整数而不是 ActiveRecord 对象。然后我就可以从执行块内部检查并查看有问题的小部件是否仍然存在。

最佳答案

您可以 rescue_from ActiveJob::DeserializationError当无法再找到对象时抛出。注意:这种反序列化发生在执行回调之前,这就是为什么您可以使用执行回调来处理这种情况。

因此,在您的工作类别中,您可以添加:

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

rescue_from返回 true那么它表示错误已被处理并且作业成功完成。在这种情况下,我刚刚检查了导致反序列化错误的错误是否是 ActiveRecord::RecordNotFound (这是当 ActiveJob 找不到对象时用于序列化和反序列化 ActiveRecord 对象的 globalid gem 引起的)。

关于ruby-on-rails - 当您将一个对象传递给 ActiveJob 入队并且该对象在执行时不再存在时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30576519/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com