【发布时间】:2011-11-11 01:46:38
【问题描述】:
我想在 Heroku 上每分钟运行一个任务,以检查是否满足条件以使某些用户任务超时。我只能每小时运行一次 Heroku cron 作业,那么设置这样的定时任务的最佳方法是什么。我在 Heroku 上使用 Rails 3.1。
【问题讨论】:
标签: ruby-on-rails heroku cron scheduling ruby-on-rails-3.1
我想在 Heroku 上每分钟运行一个任务,以检查是否满足条件以使某些用户任务超时。我只能每小时运行一次 Heroku cron 作业,那么设置这样的定时任务的最佳方法是什么。我在 Heroku 上使用 Rails 3.1。
【问题讨论】:
标签: ruby-on-rails heroku cron scheduling ruby-on-rails-3.1
【讨论】:
delayed_job 解决方案会更好。
您可以将delayed_job 与带有:run_at 的自重启作业一起使用。有点像这样:
class YourJob
def do_interesting_things
#... Do what needs to be done.
self.delay(:run_at => 1.minute.from_now).do_interesting_things
end
def self.start_me_up
new.do_interesting_things
end
end
然后在您的应用程序初始化期间的某个地方:
YourJob.start_me_up
【讨论】:
delay 调用将一个条目添加到 DelayedJob 队列,DJ 将在扫描队列时调用 do_interesting_things。所以do_interesting_things 并不是真的在呼唤自己,而是让 DJ 稍后呼唤自己。
发条是要走的路,但我会建议另一种解决方法。
使用调度程序(每 10 分钟)+ 延迟作业每分钟执行一次任务。这似乎比没有调度程序的解决方案更可靠。
MyJob.run!
(1..8).each |i|
MyJob.delay(run_at: i.minutes.from_now).run! # create 8 more jobs (each start 1 minute later)
end
【讨论】: