1

동일한 jRuby 프로세스의 ActiveRecord 백엔드와 다른 스레드에서 작업 스케줄링 (rufus_scheduler) 및 처리 (delayed_job, DJ) 작업을 실행하려고합니다.Threaded DelayedJob 작업자가 ActiveRecord 연결 풀을 말끔히 처리합니다.

한 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 

올바르게 실행하려면 방법이 있습니까?

+0

여러 가지 문제가있는 것 같습니다 (https://ylan.segal-family.com/blog/2013/09/11/delayedjob-workers-are-not-thread-safe/). 스레드 DelayedJob 노동자. – chickenburgers

답변

0

어떻게

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

제안 해 주셔서 감사합니다. 불행히도 문제가 해결되지 않습니다. – tschoppi