Resque: как я могу использовать определенного работника только для одной конкретной очереди

в моем приложении rails 5 я использую resque и resque-scheduler для отправки сообщения моему клиенту. для этого я создал другую очередь для сообщений и создал 3 рабочих для отправки сообщения с использованием очереди. Итак, здесь мой вопрос: как я могу использовать одного конкретного работника для одной конкретной очереди. т. е. у меня есть четыре очереди, такие как Birthday_checker, напоминание_сообщение, назначение_проверки, подтверждение_сообщения. Для назначения_проверки я установил cron, он будет запускаться каждые 56 секунд. для этого все мои 3 работника заняты запуском очереди Assessment_checker. и другие задания в очереди находятся в ожидании. но здесь я могу зарезервировать одного работника для этой очереди Assessment_checker. так можно?

я попытался найти некоторые связанные вопросы в стеке, но я не могу найти для этого конкретное решение.

Вот мой код файла resque.god

rails_env   = ENV['RAILS_ENV']
rails_root  = File.dirname(__FILE__) + '/..'
num_workers = rails_env == 'production' ? 3 : 2

num_workers.times do |num|
 God.watch do |w|
   w.dir      = "#{rails_root}"
   w.name     = "resque-#{num}"
   w.group    = 'resque'
   w.interval = 30.seconds
   w.env      = {"QUEUE"=>"*", "RAILS_ENV"=>rails_env}
   w.start    = "bundle exec rake -f #{rails_root}/Rakefile environment resque:work"
   w.log      = "#{rails_root}/log/resque.log"
   w.err_log  = "#{rails_root}/log/resque_error.log"

#    w.uid = 'git'
#    w.gid = 'git'

   # restart if memory gets too high
   w.transition(:up, :restart) do |on|
     on.condition(:memory_usage) do |c|
       c.above = 350.megabytes
       c.times = 2
     end
   end

   # determine the state on startup
   w.transition(:init, { true => :up, false => :start }) do |on|
     on.condition(:process_running) do |c|
       c.running = true
     end
   end

   # determine when process has finished starting
   w.transition([:start, :restart], :up) do |on|
     on.condition(:process_running) do |c|
       c.running = true
       c.interval = 5.seconds
     end

     # failsafe
     on.condition(:tries) do |c|
       c.times = 5
       c.transition = :start
       c.interval = 5.seconds
     end
   end

   # start if process is not running
   w.transition(:up, :start) do |on|
     on.condition(:process_running) do |c|
       c.running = false
     end
   end
 end
end

А это код файла lib/tasks/resque_scheduler.rake

namespace :resque do
  task :setup => :environment do
    require 'resque'
    ENV['QUEUE'] = '*'
  end
  task :setup_schedule => :setup do
    require 'resque-scheduler'
    Resque.schedule = YAML.load_file('config/resque_schedule.yml')
  end
  task :scheduler => :setup_schedule
end

Я изо всех сил старался задать свой первый вопрос о stackoverflow, поэтому, пожалуйста, проигнорируйте небольшую ошибку и дайте мне какое-то решение для вышеуказанного вопроса. Спасибо!


person Risky leopard    schedule 17.05.2019    source источник


Ответы (1)


ENV['QUEUE'] = '*' — это подстановочный знак для всех очередей. Каждая очередь будет иметь имя класса, с которым вы стоите в очереди. Просто замените * на имя очереди, которую вы хотите запустить.

person Marlin Pierce    schedule 17.05.2019
comment
Спасибо, Марлин, я это знаю, но здесь я заменяю * на имя моей очереди, а затем запускаю только эту конкретную очередь. тогда как будет вызываться моя другая очередь? - person Risky leopard; 17.05.2019