1

我正在使用带有 sidekiq 的 Rails 多租户应用程序。我将它添加到 apartment-sidekiq,以便它使用 redis 在后台运行作业。我的问题是,当我在 Rails c 上运行 MyWorker 时,出现此错误:

警告:Apartment::TenantNotFound:以下模式之一无效:“companydemo”“public”。

或者如果我尝试在工作人员内部查询“User.last”,我会得到 PG::UndefinedTable: ERROR: 关系“public.users”不存在。

我的宝石

gem 'apartment', '~> 1.0', '>= 1.0.2'
gem 'sidekiq', '~> 4.0', '>= 4.1'
gem 'apartment-sidekiq', '~> 0.2.0'

过程文件

web: bundle exec puma -C config/puma.rb
log: tail -f log/development.log
redis_s: redis-server
worker: bundle exec sidekiq -e production -C ./config/sidekiq.yml

我设置了一个简单的工人来查看结果。

  class MyWorker
  include Sidekiq::Worker
    def perform(tenant)
      puts  "------------------------"
      puts  "------------------------"
      puts  "Tenant #{tenant}"
      puts  "Current Tenant #{Apartment::Tenant.current}"
      puts  "------------------------"
      puts  "------------------------"
    end
  end

在此处输入图像描述

更多细节在这里:要点细节我的sidekiq帖子我的公寓sidekiq帖子

更新

运行rake middleware我发现 apartment-sidekiq 没有在中间件上运行。

use Rack::Sendfile
use ActionDispatch::Static
use Rack::Lock
use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x007febcb0e51f0>
use Rack::Runtime
use Rack::MethodOverride
use ActionDispatch::RequestId
use Rails::Rack::Logger
use ActionDispatch::ShowExceptions
use MetaRequest::Middlewares::Headers
use WebConsole::Middleware
use ActionDispatch::DebugExceptions
use BetterErrors::Middleware
use Raygun::Middleware::RackExceptionInterceptor
use Raygun::Middleware::RailsInsertAffectedUser
use ActionDispatch::RemoteIp
use ActionDispatch::Reloader
use ActionDispatch::Callbacks
use ActiveRecord::Migration::CheckPending
use ActiveRecord::ConnectionAdapters::ConnectionManagement
use ActiveRecord::QueryCache
use ActionDispatch::Cookies
use ActionDispatch::Session::CookieStore
use ActionDispatch::Flash
use ActionDispatch::ParamsParser
use Rack::Head
use Rack::ConditionalGet
use Rack::ETag
use Apartment::Elevators::Subdomain
use Warden::Manager
use Apartment::Reloader
use JQuery::FileUpload::Rails::Middleware
use MetaRequest::Middlewares::MetaRequestHandler
use MetaRequest::Middlewares::AppRequestHandler
use Bullet::Rack
use Apartment::Elevators::Subdomain
use RecurringSelectMiddleware
run App::Application.routes

更新解决方案 在带有 -e 生产的 procfile sidekiq 上使用。

4

1 回答 1

2

根据您的错误日志,看起来该作业已成功排队,并推送到 Sidekiq 进行处理。它还发送了您的“公寓”参数,因此问题似乎是:

  • A)您实际上没有创建名为“companydemo”的模式。
  • B)您没有“正确”连接到您的 postgre 数据库。

假设使用连接到控制台rails console然后运行Apartment::Tenant.switch!('companydemo')不会引发错误......你肯定在这里有一些复杂的 Sidekiq 设置,所以我倾向于“B”。

对我来说看起来很奇怪的一件事是您的 Procfile 中的这一行:

worker: bundle exec sidekiq -e production -C ./config/sidekiq.yml

-e production如果您使用 Foreman 在本地运行您的项目,那么即使它在 dev 中,您也明确地将您的环境设置为“生产”( )。如果您在本地运行它并且 sidekiq 正在尝试连接到远程数据库,这可能会导致您无法连接到数据库。

于 2017-01-04T18:53:41.007 回答