与Sidekiq一起使用Rails activejob会在perform_later上生成多个作业

时间:2016-10-11 10:49:52

标签: ruby-on-rails sidekiq ruby-on-rails-5 rails-activejob

我有一个相当简单的Rails 5应用程序,用于监控网站速度。它将作业发送到外部页面速度测试服务,并定期检查作业是否完整,如果是,则调用并存储有关页面的数据。

每个项目可以有很多页面,每个页面都可以有很多作业,这是测试服务的响应存储的地方。

有一个带有sidekiq后端的activejob,它应该每分钟运行一次,检查要运行的页面,如果找到任何页面,则启动一个作业来排队。它还会检查是否有任何已排队的作业,如果找到它们,它会调整作业以检查状态并保存数据(如果已完成)。

def perform() 
#Todo:- Add some way of setting the status into the view and check for active here - no way to stop jobs at the mo!
pagestorun = Page.where("runtime < ?", DateTime.now)

pagestorun.each do |page|
  job = Job.new(:status => "new")
  page.jobs << job
  updatedatetime(page)
end

 if pagestorun.count != 0
  #Run the queuejob task to pick out all unqueued jobs and send them to webpagespeedtest
  QueuejobsJob.perform_later
 end

#检查队列中的所有作业,然后安排下一个任务   GetrunningtasksJob.perform_later   FindjobstorunJob.set(等待:1.minute).perform_later() 端

这似乎有点像预期的那样有效,但是在5分钟左右之后,两个工作似乎最终会同时产生。最终每个人都产生了更多自己的东西,几天后我最终成功地试图每小时跑步。我没有最好的错误或失败的工作,我找不到任何理由为什么会发生这种情况。任何帮助将是mundo赞赏:))

1 个答案:

答案 0 :(得分:1)

由于失败,有可能会重置作业,当与常规的60秒计划重叠时,可能会导致您遇到的双重调度。有关详细信息,请参阅Sidekiq wiki中的Error Handling

  

BTW 我不完全确定这是一项有效的工作,这是运行定期任务的最佳方式(除非您使用sidekiq的企业periodical-jobs)。相反,我会使用一个每60秒运行一次rake任务的cron作业,rake   任务会安排作业检查特定页面   QueuejobsJob.perform_later page.id