2011-10-18 9 views
10

Udało mi się skonfigurować moich pracowników i wykonywali je bez problemu (w fazie rozwoju), ale teraz nie są ani w produkcji, ani w rozwoju (zgaduję, po zmianie z SQlite3 na PostgreSQL).Pracownik Resque zawodzący z serwerem PostgreSQL

Kiedy uruchomić polecenie natarcia Aby uruchomić pracownikom rake resque:work QUEUE=* otrzymuję następujący komunikat o błędzie i ślad stosu:

getaddrinfo: nodename nor servname provided, or not known 

otrzymuję następujące błędy podczas uruchamiania heroku rake resque:work QUEUE=* w konsoli do testowania pracowników oczekujących w kolejce .

Class   SentimentJob 
Arguments  [4, 5, 6] 
Exception  ActiveRecord::StatementInvalid 
Error   PGError: server closed the connection unexpectedly This probably means 
       the server terminated abnormally before or while processing the request. 
       : SELECT a.attname, format_type(a.atttypid, a.atttypmod), d.adsrc, 
       a.attnotnull FROM pg_attribute a LEFT JOIN pg_attrdef d ON a.attrelid = 
       d.adrelid AND a.attnum = d.adnum WHERE a.attrelid = '"taggings"'::regclass 
       AND a.attnum > 0 AND NOT a.attisdropped ORDER BY a.attnum 

A dla mojego pracownika Facebooku:

Class   FBConnectionsJob 
Arguments  1 
Exception  OpenSSL::SSL::SSLError 
Error   SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: 
       certificate verify failed 

Class   FBConnectionsJob 
Arguments  1 
Exception  ActiveRecord::StatementInvalid 
Error   PGError: server closed the connection unexpectedly This probably means 
       the server terminated abnormally before or while processing the request. 
       : SELECT tablename FROM pg_tables WHERE schemaname = ANY 
       (current_schemas(false)) 

Dlaczego otrzymuję różne błędy w różnych środowiskach? Moje pliki inicjalizatora wyglądają następująco:

Czy powinienem tu dodać specyfikacje ENV?

Resque.rb

uri = URI.parse(ENV["REDISTOGO_URL"]) 
Resque.redis = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password) 
Dir["#{Rails.root}/app/jobs/*.rb"].each { |file| require file } 

Redis.rb

uri = URI.parse(ENV["REDISTOGO_URL"]) 
REDIS = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password) 
Resque.redis = REDIS 

Moja środowisk/production.rb plik ma żadnego odniesienia do Redis i mojego Środowiska/rozwoju. rb plik ma to dla ustawienia Redis:

ENV["REDISTOGO_URL"] = 'redis://username:[email protected]:6789' 
+0

Dla mnie wygląda na to, że problem przypomina połączenie z bazą danych, a nie Redis. Czy korzystasz z niestandardowej konfiguracji? –

+0

Poszedłem do książki, hej. – Simpleton

Odpowiedz

29

dodanie następujących do mojego Rakefile ustalone podobny problem dla mnie:

task "resque:setup" => :environment do 
    Resque.before_fork = Proc.new { ActiveRecord::Base.establish_connection } 
end 

ten wznawia PostgreSQL przed Resque przedstawia proces tworzenia pracownika.

0

Wygląda na to, że Twoja aplikacja nie może połączyć się z serwerem Redis. Czy podałeś poprawne dane połączenia dla środowiska produkcyjnego? Czy jest dostępny serwer Redis? Czy to nie za firewallem jest jakaś prywatna sieć?

Myślę, że to może być ten sam problem z produkcyjnym serwerem PostgreSQL.

+0

Naprawdę mogę uzyskać dostęp do serwera Redis zarówno na Heroku, jak i na etapie rozwoju - nic nie zmieniłem w środowisku localhost, aby się nie zmieniło. – Simpleton

+1

Czy czegoś brakuje? Nie widzę żadnych błędów związanych z Redis. –

0

Zmieniono inicjatory na następujące i teraz działa na localhost, więc @mirtinciu miał rację co do połączenia z serwerem. Nadal trzeba dowiedzieć się, co jest nie tak na serwerze produkcyjnym.

if Rails.env.development? 
    uri = URI.parse(ENV["REDISTOGO_URL"]) 
    Resque.redis = Redis.new(:host => 'localhost', :port => '6379') 
else 
    uri = URI.parse(ENV["REDISTOGO_URL"]) 
    Resque.redis = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password) 
end