1

Sidekiqでキューに入れられたジョブで実行しているときに、モデルの1つで特定のコード行でいくつかの異なるエラーが発生します。問題のコードは次のとおりです。

@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.html、http//m.onkey.org/thread-safety-for-your-rails(特に「Rubyの要求はアトミックではありません」のセクション)。

于 2012-11-14T19:13:14.140 に答える