Почему apartment-sidekiq не находит арендатора?

Я использую мультиарендное приложение rails с sidekiq. Я добавляю его apartment-sidekiq, чтобы он выполнял задания в фоновом режиме с помощью Redis. Моя проблема в том, что когда я запускаю MyWorker на рельсах, я получаю эту ошибку:

ПРЕДУПРЕЖДЕНИЕ: Apartment::TenantNotFound: одна из следующих схем недействительна: companydemo public.

или если я попытаюсь запросить User.last внутри работника, я получу PG::UndefinedTable: ОШИБКА: отношение public.users не существует.

мой драгоценный камень

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

procfile

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

введите здесь описание изображения

более подробная информация здесь: основная информация, мой пост на стороне, сообщение о моей квартире

Обновить

запуск 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

Решение по обновлению использовалось в procfile sidekiq с параметром -e production.


person Frank004    schedule 19.12.2016    source источник


Ответы (1)


Основываясь на вашем журнале ошибок, похоже, что задание успешно поставлено в очередь и отправлено в Sidekiq для обработки. Он также получил ваш параметр «квартира», поэтому проблема выглядит так:

  • A) На самом деле у вас нет созданной схемы под названием «companydemo».
  • Б) Вы неправильно подключены к своей базе данных postgre.

Предполагая, что подключение к консоли с помощью rails console и последующий запуск Apartment::Tenant.switch!('companydemo') не выдает ошибок... у вас определенно есть сложная настройка Sidekiq здесь, так что я склоняюсь к "B".

Единственное, что мне кажется странным, это строка в вашем Procfile:

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

Если вы запускаете свой проект локально с помощью Foreman, вы явно устанавливаете для своей среды значение «производство» (-e production), даже если оно находится в режиме разработки. Это потенциально может привести к тому, что вы не сможете подключиться к базе данных, если вы запускаете ее локально, а sidekiq пытается подключиться к удаленной базе данных.

person typeoneerror    schedule 04.01.2017