Resque.enqueue-andernfalls auf dem zweiten laufen
Ich versuche auf port eine Anwendung von Rails 3.0.3 auf Rails 3.1 rc... ich glaube nicht, verpasst habe ich nichts, in Bezug auf die Konfiguration. Der Prozess funktioniert perfekt in Rails 3.0.X und nicht in der 3.1 rc.
In der Konsole, ich:
Resque.enqueue(EncodeSong, Song.find(20).id, Song.find(20).unencoded_url)
Alles funktioniert so weit. Resque-web-Berichte keine fehlgeschlagene Aufträge. Und, ich bekomme die beiden "legt' aus dem Modul EncodeSong.
Allerdings läuft Resque.enqueue(EncodeSong, Song.finden(20).id, Song.finden(20).unencoded_url) ein zweites mal, wird die folgende Fehlermeldung zurück in resque-web (unten). Um den Fehler Weg zu gehen, ich hätte um den Prozess zu beenden, das ist ausgeführt: QUEUE=* rake Umgebung resque:work und es erneut in die Konsole-Fenster. Aber das problem kommt wieder, nach dem Versuch Resque.enqueue() nach dem ersten mal.
Class
EncodeSong
Arguments
20
"https://bucket_name.s3.amazonaws.com/unencoded/users/1/songs/test.mp3"
Exception
PGError
Error
server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request.
/Users/Chris/.rvm/gems/ruby-1.9.2-p136@railspre/gems/activerecord-3.1.0.rc1/lib/active_record/connection_adapters/postgresql_adapter.rb:272:in `exec'
/Users/Chris/.rvm/gems/ruby-1.9.2-p136@railspre/gems/activerecord-3.1.0.rc1/lib/active_record/connection_adapters/postgresql_adapter.rb:272:in `block in clear_cache!'
/Users/Chris/.rvm/gems/ruby-1.9.2-p136@railspre/gems/activerecord-3.1.0.rc1/lib/active_record/connection_adapters/postgresql_adapter.rb:271:in `each_value'
/Users/Chris/.rvm/gems/ruby-1.9.2-p136@railspre/gems/activerecord-3.1.0.rc1/lib/active_record/connection_adapters/postgresql_adapter.rb:271:in `clear_cache!'
/Users/Chris/.rvm/gems/ruby-1.9.2-p136@railspre/gems/activerecord-3.1.0.rc1/lib/active_record/connection_adapters/postgresql_adapter.rb:299:in `disconnect!'
/Users/Chris/.rvm/gems/ruby-1.9.2-p136@railspre/gems/activerecord-3.1.0.rc1/lib/active_record/connection_adapters/abstract/connection_pool.rb:191:in `block in disconnect!'
/Users/Chris/.rvm/gems/ruby-1.9.2-p136@railspre/gems/activerecord-3.1.0.rc1/lib/active_record/connection_adapters/abstract/connection_pool.rb:190:in `each'
/Users/Chris/.rvm/gems/ruby-1.9.2-p136@railspre/gems/activerecord-3.1.0.rc1/lib/active_record/connection_adapters/abstract/connection_pool.rb:190:in `disconnect!'
/Users/Chris/.rvm/gems/ruby-1.9.2-p136@railspre/gems/activesupport-3.1.0.rc1/lib/active_support/core_ext/module/synchronization.rb:35:in `block in disconnect_with_synchronization!'
/Users/Chris/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/monitor.rb:201:in `mon_synchronize'
/Users/Chris/.rvm/gems/ruby-1.9.2-p136@railspre/gems/activesupport-3.1.0.rc1/lib/active_support/core_ext/module/synchronization.rb:34:in `disconnect_with_synchronization!'
/Users/Chris/.rvm/gems/ruby-1.9.2-p136@railspre/gems/activerecord-3.1.0.rc1/lib/active_record/connection_adapters/abstract/connection_pool.rb:407:in `remove_connection'
/Users/Chris/.rvm/gems/ruby-1.9.2-p136@railspre/gems/activerecord-3.1.0.rc1/lib/active_record/connection_adapters/abstract/connection_specification.rb:116:in `remove_connection'
/Users/Chris/.rvm/gems/ruby-1.9.2-p136@railspre/gems/activerecord-3.1.0.rc1/lib/active_record/connection_adapters/abstract/connection_specification.rb:79:in `establish_connection'
/Users/Chris/.rvm/gems/ruby-1.9.2-p136@railspre/gems/activerecord-3.1.0.rc1/lib/active_record/connection_adapters/abstract/connection_specification.rb:60:in `establish_connection'
/Users/Chris/.rvm/gems/ruby-1.9.2-p136@railspre/gems/activerecord-3.1.0.rc1/lib/active_record/connection_adapters/abstract/connection_specification.rb:55:in `establish_connection'
/Users/Chris/Sites/site_name/lib/tasks/resque.rake:17:in `block (2 levels) in <top (required)>'
/Users/Chris/.rvm/gems/ruby-1.9.2-p136@railspre/gems/resque-1.16.1/lib/resque/worker.rb:355:in `call'
/Users/Chris/.rvm/gems/ruby-1.9.2-p136@railspre/gems/resque-1.16.1/lib/resque/worker.rb:355:in `run_hook'
/Users/Chris/.rvm/gems/ruby-1.9.2-p136@railspre/gems/resque-1.16.1/lib/resque/worker.rb:162:in `perform'
/Users/Chris/.rvm/gems/ruby-1.9.2-p136@railspre/gems/resque-1.16.1/lib/resque/worker.rb:130:in `block in work'
/Users/Chris/.rvm/gems/ruby-1.9.2-p136@railspre/gems/resque-1.16.1/lib/resque/worker.rb:116:in `loop'
/Users/Chris/.rvm/gems/ruby-1.9.2-p136@railspre/gems/resque-1.16.1/lib/resque/worker.rb:116:in `work'
/Users/Chris/.rvm/gems/ruby-1.9.2-p136@railspre/gems/resque-1.16.1/lib/resque/tasks.rb:27:in `block (2 levels) in <top (required)>'
/Users/Chris/.rvm/gems/ruby-1.9.2-p136@railspre/gems/rake-0.9.0/lib/rake/task.rb:205:in `call'
/Users/Chris/.rvm/gems/ruby-1.9.2-p136@railspre/gems/rake-0.9.0/lib/rake/task.rb:205:in `block in execute'
/Users/Chris/.rvm/gems/ruby-1.9.2-p136@railspre/gems/rake-0.9.0/lib/rake/task.rb:200:in `each'
/Users/Chris/.rvm/gems/ruby-1.9.2-p136@railspre/gems/rake-0.9.0/lib/rake/task.rb:200:in `execute'
/Users/Chris/.rvm/gems/ruby-1.9.2-p136@railspre/gems/rake-0.9.0/lib/rake/task.rb:158:in `block in invoke_with_call_chain'
/Users/Chris/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/monitor.rb:201:in `mon_synchronize'
/Users/Chris/.rvm/gems/ruby-1.9.2-p136@railspre/gems/rake-0.9.0/lib/rake/task.rb:151:in `invoke_with_call_chain'
/Users/Chris/.rvm/gems/ruby-1.9.2-p136@railspre/gems/rake-0.9.0/lib/rake/task.rb:144:in `invoke'
/Users/Chris/.rvm/gems/ruby-1.9.2-p136@railspre/gems/rake-0.9.0/lib/rake/application.rb:112:in `invoke_task'
/Users/Chris/.rvm/gems/ruby-1.9.2-p136@railspre/gems/rake-0.9.0/lib/rake/application.rb:90:in `block (2 levels) in top_level'
/Users/Chris/.rvm/gems/ruby-1.9.2-p136@railspre/gems/rake-0.9.0/lib/rake/application.rb:90:in `each'
/Users/Chris/.rvm/gems/ruby-1.9.2-p136@railspre/gems/rake-0.9.0/lib/rake/application.rb:90:in `block in top_level'
/Users/Chris/.rvm/gems/ruby-1.9.2-p136@railspre/gems/rake-0.9.0/lib/rake/application.rb:129:in `standard_exception_handling'
/Users/Chris/.rvm/gems/ruby-1.9.2-p136@railspre/gems/rake-0.9.0/lib/rake/application.rb:84:in `top_level'
/Users/Chris/.rvm/gems/ruby-1.9.2-p136@railspre/gems/rake-0.9.0/lib/rake/application.rb:62:in `block in run'
/Users/Chris/.rvm/gems/ruby-1.9.2-p136@railspre/gems/rake-0.9.0/lib/rake/application.rb:129:in `standard_exception_handling'
/Users/Chris/.rvm/gems/ruby-1.9.2-p136@railspre/gems/rake-0.9.0/lib/rake/application.rb:59:in `run'
/Users/Chris/.rvm/gems/ruby-1.9.2-p136@railspre/gems/rake-0.9.0/bin/rake:31:in `<top (required)>'
/Users/Chris/.rvm/gems/ruby-1.9.2-p136@railspre/bin/rake:19:in `load'
/Users/Chris/.rvm/gems/ruby-1.9.2-p136@railspre/bin/rake:19:in `<main>'
Hier ist der rest von meinem relevante code:
/config/Initialisierungen/resque.rb
require 'resque'
uri = URI.parse(APP_CONFIG['redis_to_go_url'])
Resque.redis = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password)
# Load all jobs at /app/jobs
Dir["#{Rails.root}/app/jobs/*.rb"].each { |file| require file }
/app/jobs/encode_song.rb
module EncodeSong
@queue = :encode_song
def self.perform(media_id, s3_file_url)
begin
media = Song.find(media_id)
puts 'foo11111'
puts media.id
rescue
puts "Error #{$!}"
end
end
end
lib/tasks/resque.rake
require 'resque/tasks'
task "resque:setup" => :environment do
ENV['QUEUE'] = '*'
# ONLY on Heroku, since they are still running PostgreSql 8 on their shared plan.
# This block of code is not needed on PostgreSql 9, as tested on local environment.
# Issue: My best guess is that master resque process establishes connection to db,
# while loading rails app classes, models, etc, and that connection becomes corrupted
# in fork()ed process (on exit?). Possible fix is to reestablish the connection the AR
# after a Resque fork.
Resque.after_fork do |job|
ActiveRecord::Base.establish_connection
end
end
desc "Alias for resque:work (To run workers on Heroku)"
task "jobs:work" => "resque:work"
Nicht sehr sicher, aber es kann auch etwas im Zusammenhang mit diesem Problem. Meine Vermutung ist, dass master-resque-Prozess stellt die Verbindung zu db, beim laden von Schienen-app, Klassen, Modelle, etc, und dass die Verbindung beschädigt wird, in fork () " ed-Prozesses (exit?).
Jede Hilfe /Richtung geschätzt wird.
EDIT:
Wenn ich entfernen Sie den folgenden block von lib/tasks/resque.rake:
Resque.after_fork do |job|
ActiveRecord::Base.establish_connection
end
Und in der Konsole ausführen Resque.enqueue(EncodeSong, Song.finden(20).id, Song.finden(20).unencoded_url)
Bekomme ich eine neue Fehlermeldung (in der Konsole, wo die QUEUE=* rake Umgebung resque:work ausgeführt wurde):
Error PGError: ERROR: prepared statement "a3" already exists
: SELECT "songs".* FROM "songs" WHERE "songs"."id" = $1 LIMIT 1
Scheint es, könnte dies ein bug mit dem adapter? Könnte hier falsch sein. Ihre Gedanken?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese gelöst hat es für mich:
Quelle: carhartl Kommentar auf Github
before_fork
irgendwo als gut. Weiß nicht, was für Auswirkungen es gibt im Vergleich zuafter_fork
lib/tasks/resque.rake
.after_fork
Haken, um eine neue Verbindung aufzubauen, die auf der Kind-Prozess statt, der auf den parent-Prozess. (PS: ich bin der maintainer von resque)