如何让延迟工作入队

时间:2018-04-25 17:03:14

标签: ruby-on-rails ruby delayed-job

我正在为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方法执行时,它会添加一个额外的作业,然后添加一个额外的作业,并且具有预定作业的队列会很快变脏。

我只是在尝试,这可能是我案件中最接近的解决方法(虽然有点傻)。我没有尝试其他替代方案,但任何建议将不胜感激。谢谢。

1 个答案:

答案 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)回调

中也有相同的逻辑