1

Ich möchte Job-Planung (mit rufus_scheduler) und Verarbeitung (mit delayed_job, DJ) mit dem ActiveRecord-Backend aus dem gleichen jRuby-Prozess, aber in verschiedenen Threads.Thread DelayedJob Arbeiter trocknen ActiveRecord Verbindung Pool

Dies funktioniert gut, wenn nur ein DJ Arbeiter in Gebrauch ist, aber wenn ich mehrere Warteschlangen eingerichtet (mit einem Arbeiter pro Warteschlange), beendet der Scheduler mit der folgenden Meldung:

rufus-scheduler intercepted an error:                    
    job:                               
    Rufus::Scheduler::CronJob "*/10 * * * * *" {}                 
    error:                            
    ActiveRecord::ConnectionTimeoutError                    
    could not obtain a connection from the pool within 5.000 seconds (waited 5.000 seconds); all pooled connections were in use 

Dies führt mich zu Ich glaube, dass die Arbeiter die Datenbankverbindungen nach Beendigung des Jobs nicht freigeben, aber ich muss den entsprechenden Code noch finden. Die Anzahl der Verbindungen im Pool ist so konfiguriert, dass sie 50 ist.

Das Skript soll so lange weiterlaufen, bis es empfängt und Zugriff auf die Rails-Umgebung haben soll. Ein MWE ist unten angegeben:

require './config/environment' 

module Jobs 
    class ExampleJob < ActiveJob::Base 
    queue_as :system 

    def perform 
     puts 'Performing ExampleJob' 
    end 
    end 
end 

QUEUES = %i(system database).freeze 
NUM_QUEUES = QUEUES.size 

workers = [] 
worker_threads = [] 

NUM_QUEUES.times do |queue_number| 
    worker = Delayed::Worker.new(quiet: false) 
    worker.name = queue_number 
    workers.append(worker) 
    worker_threads.append(Thread.new do 
    worker.start 
    end) 
end 

scheduler = Rufus::Scheduler.new 

scheduler.cron '*/10 * * * * *' do 
    puts 'Scheduled ExampleJob' 
    Jobs::ExampleJob.perform_later 
end 

Signal.trap('TERM') do 
    scheduler.shutdown 
    workers.each do |worker| 
    worker.stop 
    end 
end 

scheduler.join 
worker_threads.each do |thread| 
    thread.join 
end 

Gibt es eine Möglichkeit, dies ordnungsgemäß ausgeführt werden?

+0

Es scheint [alle Arten von Problemen] (https://ylan.segal-family.com/blog/2013/09/11/delayedjob-workers-are-not-thread-safe/) mit der Verwendung mehrerer DelayedJob-Mitarbeiter eingefädelt. – chickenburgers

Antwort

0

Wie wäre es

module Jobs 
    class ExampleJob < ActiveJob::Base 
    queue_as :system 

    def perform 
     puts 'Performing ExampleJob' 
    end 

    after_perform do 
     ActiveRecord::Base.clear_active_connections! 
    end 
    end 
end 

?

+0

Danke für den Vorschlag, leider löst das das Problem nicht. – tschoppi