Я реализую интерфейс потоковой передачи видео для 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 внутри выполнения, он добавляет дополнительное задание, которое затем добавляет дополнительное задание, и очередь с запланированными заданиями действительно быстро загрязняется.
Я просто экспериментирую, и это, вероятно, самый близкий обходной путь (хотя и немного глупый) для моего случая. Я не пробовал другие варианты, но любые предложения будут оценены. Спасибо.