2016-07-05 2 views
0

В контроллере у меня есть запрос на отправку аутентифицированного пользователя, запускающего ActiveJob.Очередь в Delayed_Job с ActiveJobs

RunReportsJob.perform_later(param1, param2, param3) 

Он работает без ошибок. Но если пользователь снова нажимает кнопку (запрос на стрельбу), чтобы запустить RunReportsJob, пока он уже запущен, одновременно выполняются 2 задания. Я настраиваю delayed_job, потому что я думал, что это служба очередей, и будет хранить все на одной задаче за раз. Но этого не происходит. Ниже моя конфигурация:

# app/jobs/run_reports_job.rb:

class RunReportsJob < ActiveJob::Base 
     queue_as :RunReports 
     include ShopifyApp::Controller 
     # -------------------------------------------------------------- 
     # JOB ERROR MANAGEMENT 
     # -------------------------------------------------------------- 
     rescue_from(ActiveRecord::RecordNotFound) do |exception| 
      # Do something with the exception 
      logger.debug "Hit rescue_from" 
     end 
     # -------------------------------------------------------------- 
     # JOB FUNCTION 
     # -------------------------------------------------------------- 
     def perform(param1, param2, param3) 
     # some code is performed here 
     end 
end 

:

config.active_job.queue_adapter = :delayed_job 

# config/initializers/delayed_job_config.rb:

Delayed::Worker.max_attempts = 1 
Delayed::Worker.max_run_time = 12.hours 

ответ

1

Вы должны добавить некоторую логику до RunReportsJob.perform_later(param1, param2, param3) проверить для уже приоритет заданий в очереди у и увеличить число приоритетов (меньшее число является более высокий приоритет, в соответствии с документацией) в этом примере очереди:

highest_priority = Delayed::Job.where(queue: :RunReports).maximum(:priority) 
Delayed::Worker.default_priority = highest_priority + 1 if highest_priority 

RunReportsJob.perform_later(param1, param2, param3) 

DelayedJob использует таблицу, чтобы сохранить всю информацию задания проверить документацию на https://github.com/collectiveidea/delayed_job#gory-details

+0

Мне нужна второй вызов задания для очереди после 1-го, а не стрелять пустым. Мне кажется, что код, который вы здесь представили, ничего не делает, если в очереди есть что-то уже в очереди –

+0

Возможно, это то, что я ищу ?: 'Delayed :: Worker.read_ahead = 1'. Если значение по умолчанию равно 5, означает ли это, что delayed_job пытается запустить последние 5, доступных в его базе данных одновременно? –

+0

oh, я получаю это сейчас, это может быть выполнено с использованием приоритета, я собираюсь изменить код ответа – neydroid

Смежные вопросы