Rails 4 Sidekiq 根本找不到 ActiveRecord 对象

Rails 4 Sidekiq cannot find the ActiveRecord Objects at all

我正在使用 Rails 4.2.6 和 sidekiq 4.2.2。我总是收到一条错误消息

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 天,我创建了工人(比如 'SendResetPasswordWorker')而不是 delay_later 方法。还是一样的错误

{"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'测试了它,另一个场景但仍然是同样的错误。

有人对此错误有任何想法吗?如果是,请分享。

终于找到答案了。我正在使用 Apartment Gem 进行多租户。在 sidekiq 内部,默认模式返回到 'public' 而不是我当前在 postgres 中的模式。因此,每次当 sidekiq 运行 后台作业时,我都必须切换回当前租户模式。

当我们运行后台代码时,真的需要一直切换回架构吗?也许我们可以在 sidekiq 中进行设置,每当它启动作业时,都会将架构切换到当前租户。我将检查最佳解决方案。谢谢。