【发布时间】:2012-11-12 23:09:38
【问题描述】:
在我的一个模型中运行 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 创建任何线程之前加载。只有一晚的工作要继续,所以我们必须看看这种趋势是否会持续......
即使这解决了眼前的问题,我认为它并不能解决真正的潜在问题,即类在使用之前没有完全加载。类加载是原子操作吗?是否有可能一个线程开始加载一个类而另一个线程在该类完全加载之前开始使用它?
【问题讨论】:
-
你能发布更多关于你的人际关系的代码吗?
-
我不确定您可能希望看到哪些附加代码。该关联是通过“has_many :book_lookups”建立的,并由“belongs_to :books”作为回报。这段代码每晚都运行了 3 个月,直到最近才出现错误。我真的认为问题与多线程有关。我已经尝试强制 BookLookup 模型在启动时加载(在任何多线程发生之前),并等待通过今晚的通宵处理来查看结果。
标签: ruby-on-rails multithreading heroku sidekiq