Каков наилучший способ перенести работу в Rails с задержкой? - PullRequest
2 голосов
/ 10 октября 2019

Я хочу автоматически поставить работу в очередь после ее завершения. Будет необязательная задержка на 10 секунд, если ничего не было обработано.

Я вижу два подхода. Первый - поместить логику в блок perform. Второе - использовать функцию around_block для этого.

Какой более элегантный способ сделать это?

Вот пример блока кода с такой логикой

# Process queue automatically
class ProcessingJob < ApplicationJob
  queue_as :processing_queue

  around_perform do |_job, block|
    if block.call.zero?
      # wait for 10 seconds if 0 items was handled
      self.class.set(wait: 10.seconds).perform_later
    else
      # don't rest, there are many work to do
      self.class.perform_later
    end
  end

  def perform
    # will return number of processed items
    ProcessingService.handle_next_batch
  end
end

Должен ли я поместить around_block логику вperform функция?

1 Ответ

0 голосов
/ 10 октября 2019
def perform
  # will return number of processed items
  processed_items_count = ProcessingService.handle_next_batch
  delay_for_next_job = processed_items_count.zero? ? 10 : 0
  next_job = self.class.set(wait: delay_for_next_job.seconds)
  next_job.perform_later
end

Вы можете извлечь delay_for_next_job как частный метод и т. Д., При необходимости применив рефакторинг.

Зачем использовать around_perform? Вам не нужен экземпляр работы здесь. В зависимости от ваших потребностей, вы также можете проверить, ожидают ли какие-либо задания в данный момент, используя что-то вроде https://github.com/mhenrixon/sidekiq-unique-jobs (извините, я не очень знаком с ActiveJob API)

...