2016-12-19 5 views
1

Ich benutze eine Rails Multitenant App mit sidekiq. Ich füge es apartment-sidekiq hinzu, damit es die Jobs im Hintergrund mit redis ausführt. Mein Problem ist, dass, wenn ich MyWorker auf den Schienen laufen c ich diesen Fehler:Warum findet Apartment-Sidekiq den Mieter nicht?

WARN: Apartment::TenantNotFound: One of the following schema(s) is invalid: "companydemo" "public".

or if I try to query "User.last" inside the worker, I get the PG::UndefinedTable: ERROR: relation "public.users" does not exist.

mein gemset

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 

ich Setup ein einfacher Arbeiter das sehen Ergebnisse.

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

enter image description here

mehr Details hier: gist detail, my sidekiq post, my apartment-sidekiq post

aktualisieren

rake middleware Laufen fand ich, dass im Apartment-sidekiq auf der Middleware nicht aktiv.

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 

aktualisieren soluction war auf dem procfile sidekiq mit -er Produktion.

Antwort

1

Basierend auf Ihrem Fehlerprotokoll sieht es so aus, als ob der Job erfolgreich in die Warteschlange eingereiht und zur Verarbeitung an Sidekiq übergeben wird. Es hat auch Ihre "Wohnung" -Parameter gesendet, so scheint das Problem entweder:

  • A) Sie haben eigentlich nicht ein Schema namens "companydemo" erstellt.
  • B) Sie sind nicht "richtig" mit Ihrer Postgre-Datenbank verbunden.

Anschluss Unter der Annahme, zu trösten mit rails console und dann Apartment::Tenant.switch!('companydemo') Lauf wirft keine Fehler ... Sie haben einige komplexe Sidekiq Setup auf jeden Fall bekam here so in Richtung „B“ Ich bin Neigung.

Das einzige, was mir seltsam aussieht, ist diese Zeile in Ihrer procfile:

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

Wenn Sie Ihr Projekt vor Ort mit Foreman laufen, sind Sie ausdrücklich Ihre Umgebung „Produktion“ -Einstellung (-e production) auch wenn es in DEV ist. Dies könnte dazu führen, dass Sie keine Verbindung zu einer Datenbank herstellen können, wenn Sie diese lokal ausführen und sidekiq versucht, eine Verbindung zu einer entfernten Datenbank herzustellen.

Verwandte Themen