我有一个相当简单的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赞赏:))
答案 0 :(得分:1)
由于失败,有可能会重置作业,当与常规的60秒计划重叠时,可能会导致您遇到的双重调度。有关详细信息,请参阅Sidekiq wiki中的Error Handling。
BTW 我不完全确定这是一项有效的工作,这是运行定期任务的最佳方式(除非您使用sidekiq的企业periodical-jobs)。相反,我会使用一个每60秒运行一次rake任务的cron作业,rake 任务会安排作业检查特定页面
QueuejobsJob.perform_later page.id