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

Posted

技术标签:

【中文标题】使用日常 cron 作业在 Rails 中使用 Ice Cube 创建的事件的正确方法【英文标题】:Correct way to use events created with Ice Cube in Rails using a daily cron job 【发布时间】:2011-10-17 16:12:49 【问题描述】:

我想使用 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

这对我来说看起来非常低效 - 但我可能做错了。有没有更好的使用 Ice Cube 的方法?

【问题讨论】:

尝试查看任何时候,它使用起来非常简单,而且效果很好。 github.com/javan/whenever 我不熟悉 Ice Cube,但我们确实在我的工作中经常使用 Resque Scheduler(双关语)。如果您想尝试一下并需要帮助,请给我发送电子邮件。 【参考方案1】:

Ice Cube 似乎擅长设置非常复杂的日程安排(发生在第 1 和第 4 个星期三,但前提是它们是偶数天,而不是周末等)

如果这就是您所需要的,那么您描述的任务可能是在这种复杂的计划中每天运行大量任务的最有效方式。如果您的日程安排不需要那么复杂,那么您可以查看任何时候(正如 MatthewFord 提到的),它只是使用 cron 日程安排来设置要执行的任务,但这是针对管理员类型的任务,因此需要要编辑的配置文件,如果您需要通过应用程序界面添加和删除内容,则该文件不起作用。

使用 Ice Cube 的另一个选项是每月安排一次 cron 来检查每个时间表,并设置另一个表来定义下个月哪些事件必须在哪些天运行。 (每一行都有一个日期和一个任务定义),您的每日 cron 可以从该表中选择...

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

【讨论】:

最终编写了我自己的简单调度程序。获取今天需要运行的所有行,对该行执行任何需要执行的操作,然后将下一次运行日期设置为今天 + 月/周/日,具体取决于它的设置。【参考方案2】:

由于您使用 ice_cube,您可以查看Sidetiq。它使用 ice_cube 来指定作业的调度,所以你很容易掌握。

我的尝试是根据这些规则生成预定事件,而不是检查所有记录以找到符合条件的记录,但我认为有很多方法可以做到这一点可能会更有效。

【讨论】:

以上是关于使用日常 cron 作业在 Rails 中使用 Ice Cube 创建的事件的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在 kubernetes cron 作业中启动 rails rake 任务

在 aws beanstalk rails 容器上安排 cron 作业

如何在 Rails 4 上实现类似 cron 作业

cron作业中的Rails类方法在弹性beantalk中不起作用

在 Heroku 中运行的 Rails 应用程序的脉冲或 cron 作业

Ruby on Rails如何在Windows 10中随时启动cron