【发布时间】:2017-11-18 06:01:19
【问题描述】:
我想使用 ActiveRecord 后端从同一个 jRuby 进程但在不同的线程中运行作业调度(使用 rufus_scheduler)和处理(使用 delayed_job,DJ)。
当只有一个 DJ 工作人员在使用时,这可以正常工作,但是当我设置多个队列(每个队列一个工作人员)时,调度程序会终止并显示以下消息:
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
有没有办法让它正常运行?
【问题讨论】:
-
似乎有all sorts of problems 使用多线程DelayedJob 工作人员。
标签: ruby multithreading activerecord delayed-job rufus-scheduler