同じjRubyプロセスのActiveRecordバックエンドで、スケジューリング(rufus_scheduler)と処理(delayed_job、DJ)を実行し、別のスレッドで実行したいとします。Threaded DelayedJobワーカーがActiveRecord接続プールを乾燥させる
ちょうど1 DJワーカーが使用されているとき、これは正常に動作しますが、私は(キューごとに1つのワーカーで)複数のキューを設定するとき、スケジューラは、次のメッセージを表示して終了:
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
これは私がにつながります仕事の終了時に労働者がデータベース接続を解放しないと思うが、私はまだ関連コードを見つけていない。プール内の接続数は50に設定されています。
スクリプトはSIGTERM
を受信してからRails環境にアクセスする必要があります。 MWEは次のとおりです。
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
これを正しく実行する方法はありますか?
[多種の問題があるようです](https://ylan.segal-family.com/blog/2013/09/11/delayedjob-workers-are-not-thread-safe/)複数のスレッドDelayedJobワーカー。 – chickenburgers