使用每日cron作业在Rails中使用Ice Cube创建事件的正确方法

Con*_*ing 12 recursion cron ruby-on-rails

我想在Rails中使用Ice Cube gem创建重复事件 - 我的问题是,我如何正确地,或者更有效地使用这些重复规则来触发实际事件?

这方面的一个例子是定期发票.

假设我每周一次设置一个Ice Cube重复集,并使用to_yaml将其保存到定期发票行.我现在在数据库中有一行带有序列化重复规则.我可以想象使用它的唯一方法是遍历数据库中的每一行,反序列化保存的重复规则并检查它是否需要今天运行schedule.occurs_on?(Date.new) - 然后将其放入每天运行的cronjob:

items = RecurringItem.find(:all)
items.each do |item|
    schedule = Schedule.from_yaml(item.schedule_yaml)
    if schedule.occurs_on?(Date.new)
        #if today is a recurrence, do stuff!
    end
end
Run Code Online (Sandbox Code Playgroud)

这看起来非常低效 - 但我可能完全错了.有没有更好的方法来使用冰立方?

mlt*_*tsy 3

Ice Cube 似乎专门设置非常复杂的时间表(发生在第一个和第四个星期三,但前提是它们是偶数天,而不是周末等)

如果这就是您所需要的,那么您描述的任务可能是每天按照这种复杂的时间表运行多个任务的最有效方法。如果您的日程安排中不需要那么复杂,那么您可以查看类似“每当”(如 MatthewFord 提到的)之类的内容,它仅使用 cron 日程安排来设置要执行的任务,但这适用于管理类型的任务,因此需要要编辑的配置文件,如果您需要通过应用程序界面添加和删除内容,则该文件不起作用。

使用 Ice Cube 的另一个选择是让每月的 cron 遍历每个计划,并设置另一个表来定义下个月的哪些事件必须在哪些天运行。(每一行都有一个日期和一个任务定义),您的每日 cron 可以从该表中选择......

每次应用程序中的一个时间表发生更改时,您还必须提前一个月更新该表……这有点麻烦,所以除非您每天有数十万个时间表需要查看一次,否则可能会很麻烦。不值得这么麻烦。

  • 最终编写了我自己的简单调度程序。获取今天需要运行的所有行,对该行执行需要执行的操作,然后将行下一次运行日期设置为今天 + 月/周/日,具体取决于其设置。 (3认同)