我正在为Rails中的Azure媒体服务API实现视频流接口,我需要不断更新上传的视频,以便通过媒体服务处理(复制,编码),状态最终可用或失败。为此,我决定使用延迟工作,但是,我不确定什么是保持工作始终运行的最佳方法。
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方法执行时,它会添加一个额外的作业,然后添加一个额外的作业,并且具有预定作业的队列会很快变脏。
我只是在尝试,这可能是我案件中最接近的解决方法(虽然有点傻)。我没有尝试其他替代方案,但任何建议将不胜感激。谢谢。
答案 0 :(得分:0)
我就这样做了:
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)
回调