2017-02-24 16 views
1

私はRails 4.2.6とsidekiq 4.2.2を使用しています。私はエラーを取得しています常にそれは、ユーザーにパスワードリセットメールを送信するときに、私は上記のエラーを取得していますRails 4 SidekiqがActiveRecordオブジェクトをまったく見つけられない

2017-02-23T07:33:23.455Z 31886 TID-ovz89uiyg WARN: {"class":"ActiveJob::QueueAdapters::SidekiqAdapter::JobWrapper","wrapped":"ActionMailer::DeliveryJob","queue":"mailers","args":[{"job_class":"ActionMailer::DeliveryJob","job_id":"d59ec97f-b858-4f47-aefd-c9150836d7d2","queue_name":"mailers","arguments":["UserMailer","send_password","deliver_now",{"_aj_globalid":"gid://my-app/User/85"},"http://0.0.0.0:3000/auth/password/edit?config=default&reset_password_token=zBdjahtAX7w3BC3Si8Fz&redirect_url="],"locale":"en"}],"retry":true,"jid":"f5dfa96df15443fc7ed2f3ce","created_at":1487832182.7783082,"enqueued_at":1487835165.842009,"error_message":"Error while trying to deserialize arguments: Couldn't find User with 'id'=85","error_class":"ActiveJob::DeserializationError","failed_at":1487832182.8214011,"retry_count":7,"retried_at":1487835203.4498932} 

を言います。

は、私が試した

UserMailer.send_password(self.id, reset_password_link).deliver_later 

バックグラウンドでメールを送信するためにこのコードを使用し、以下:

UserMailer.send_password(self.id, reset_password_link).deliver_later(wait: 1.minutes) 

そして、これらの文書が言うように、私もafter_commitコールバックを試してみました:

https://github.com/plataformatec/devise/issues/3550 https://github.com/mperham/sidekiq/issues/322

そして私はオブジェクト自体ではなくIDを渡しています。それでも私は上記のエラーが発生しています。私はsidekiqのバージョンを4.2.9に更新し、sidekiqを再起動しました。

まだ同じエラーです。 sidekiq内部のActiveRecordオブジェクトが見つかりません。 byebugを使って、sidekiqの中に非常に古いオブジェクトを見つけようとしました。しかし、sidekiqはActiveRecordオブジェクトを見つけることができません。

私はこれを1日試しています。私は、delay_laterメソッドの代わりにワーカー(SendResetPasswordWorker)を作成しました。それでも同じエラー

{"class":"SendResetPasswordWorker","args":[90,"http://0.0.0.0:3000/auth/password/edit?config=default&reset_password_token=8xTR5enYdHDpuQg6cyPZ&redirect_url="],"retry":true,"queue":"default","jid":"7a8a831d837d3e4f3d75d5f7","created_at":1487842213.2409139,"enqueued_at":1487842213.240968,"error_message":"Couldn't find User with 'id'=90","error_class":"ActiveRecord::RecordNotFound","failed_at":1487842213.267404,"retry_count":0}2017-02-23T09:30:13.268Z 35119 TID-ow2w9e41c WARN: ActiveRecord::RecordNotFound: Couldn't find User with 'id'=90 2017-02-23T09:30:13.268Z 35119 TID-ow2w9e41c WARN: /Users/abhilash/.rbenv/versions/2.2.1/gemsets/gauge-slcsl/gems/activerecord-4.2.6/lib/active_record/core.rb:155:in `find' /Users/abhilash/my-app/components/auth/app/workers/ 

私はまた別の労働者UserAgentWorker '、別のシナリオが、それでも同じエラーのためにそれをテストしました。

誰もがこのエラーについて考えていますか?はいの場合は共有してください。

+2

サイドアプリケーションをメインアプリケーションと同じ環境で実行していますか?たとえば、アプリケーションは 'production'データベースを使用しますが、Sidekiqは'開発 'で実行され、別のデータベースから読み込まれる可能性があります。 – spickermann

+0

アプリケーションとsidekiqは開発環境で動作しています。 – Abhi

答えて

0

最後に私は答えを見つけました。私はアパートの宝物を複数のテナントに使用しています。 sidekiqの内部では、現在のスキーマではなく'public'にデフォルトスキーマが戻され、postgresになります。したがって、sidekiqがバックグラウンドジョブを実行するたびに、現在のテナントスキーマに戻る必要があります。

私たちがバックグラウンドでコードを実行するときにスキーマをいつでも元に戻す必要がありますか?スキルを現在のテナントに切り替える作業を開始するたびに、sidekiqの設定を行うことができます。私はそれが最良の解決策であることを確認します。ありがとうございました。