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?
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