Как заставить отложенную работу ставить себя в очередь - PullRequest
0 голосов
/ 25 апреля 2018

Я реализую интерфейс потоковой передачи видео для API служб мультимедиа Azure в Rails, и мне нужно постоянно обновлять загруженное видео, чтобы обрабатывать его (копировать, кодировать) через службы мультимедиа, и в конечном итоге статус будет либо доступен, либо произойдет сбой. Для этого я решил использовать отложенные задания, однако я не уверен, каков наилучший способ сохранить работу всегда в рабочем состоянии.

class UpdateAzureVideosJob < ApplicationJob
  queue_as :azure_media_service

  def perform
    to_update = AzureVideo.all.map{ |v| v if v.state != 5 }.compact
    unless to_update.empty?
      to_update.each do |video|
        video.update
      end
    end

    sleep(5)
    Delayed::Job.enqueue self
  end

  def before(job)
    Delayed::Job.where("last_error is NULL AND queue = ? AND created_at <   ?", job.queue, DateTime.now).delete_all
  end
end

Причина, по которой я удаляю предыдущие задания из той же очереди, заключается в том, что когда я вызываю метод enqueue внутри выполнения, он добавляет дополнительное задание, которое затем добавляет дополнительное задание, и очередь с запланированными заданиями действительно быстро загрязняется.

Я просто экспериментирую, и это, вероятно, самый близкий обходной путь (хотя и немного глупый) для моего случая. Я не пробовал другие варианты, но любые предложения будут оценены. Спасибо.

1 Ответ

0 голосов
/ 26 апреля 2018

Вот как я это сделал:

def after(job)      
  Delayed::Job.transaction do
    Delayed::Job.create(handler: job.handler, queue: job.queue, run_at: job.run_at + 5.minutes)
    job.destroy
  end
end

Будет перепланировано выполнение задания каждые 5.minutes после завершения работы с оригиналом. Использовать его в производстве большую часть года без каких-либо проблем. Также есть та же логика в #error(job) обратном вызове

...