1

在 Sidekiq 排队作业中运行时,我的一个模型中的特定代码行出现了几个不同的错误。有问题的代码是:

@lookup_fields[:asin] ||= self.book_lookups.find_by_name("asin").try(:value)

我要么得到undefined method 'scope' for #<ActiveRecord::Associations::AssociationScope:0x00000005f20cb0>要么undefined method 'aliased_table_for' for #<ActiveRecord::Associations::AliasTracker:0x00000005bc3f90>

在另一个 Sidekiq 作业的另一行代码中,我收到错误消息undefined method 'decrypt_and_verify' for #<ActiveSupport::MessageEncryptor:0x00000007143208>

所有这些错误都毫无意义,因为它们是 Rails 运行时支持库的标准方法。

有问题的模型具有为“book_lookups”模型定义的 :has_many 关联,“name”和“value”是“book_lookups”模型中的字段。这总是发生在处理的前 1-3 条记录上。如果我在 Sidekiq 作业之外运行相同的代码,则不会发生这些错误。

我无法在我的开发机器上重现该错误,只能在 Heroku 托管的生产中重现。

我可能通过将代码“BookLookup.new()”放在初始化程序中“解决”了第一组错误,强制模型在 Sidekiq 创建任何线程之前加载。只有一晚的工作要继续,所以我们必须看看这种趋势是否会继续......

即使这解决了眼前的问题,我也不认为它解决了真正的根本问题,即类在使用之前没有完全加载。类加载是原子操作吗?一个线程是否可以开始加载一个类而另一个线程在完全加载之前开始使用该类?

4

1 回答 1

0

我相信我已经找到了答案:config.threadsafe!,但我没有这样做。我现在已经这样做了,如果不是全部的话,大多数错误都消失了。参考:http://guides.rubyonrails.org/configuring.htmlhttp://m.onkey.org/thread-safety-for-your-rails(尤其是“Ruby 的 require 不是原子的”部分)。

于 2012-11-14T19:13:14.140 回答