【问题标题】:How do you call a method every hour in Rails?你如何在 Rails 中每小时调用一个方法?
【发布时间】:2011-08-30 18:56:03
【问题描述】:

我正在使用 ResqueRedis 来处理后台作业。我想每小时调用一次方法 Resque.enqueue(MyModel) 来执行后台任务。

例如:假设我有一个拥有 10,000 名用户的网站。我想每天只调用这个方法 24 次;不是 10,000 * 24。示例方法如下:

Resque.enqueue(MyModel)

提前感谢您的帮助。我还应该提到我更喜欢坚持使用 Resque,而不是转向延迟工作。谢谢。

【问题讨论】:

  • 无限while循环,先调用方法再休眠3600秒?
  • 你怎么敢 :) 有专门的工具来做这个!
  • @apneadiving tbh,在这种简单的情况下(尤其是在您需要访问对象的情况下),我可能会像设置 cron 作业一样这样做。

标签: ruby-on-rails ruby methods time resque


【解决方案1】:

您可以轻松地使用Whenever,它完全符合您的要求,而且还有很多其他功能,它有一个非常好的文档。

你可以使用这样的语法:

every 3.hours do
    runner "MyModel.some_process"
    rake "my:rake:task"
    command "/usr/bin/my_great_command"
end

安装它使用:

$ gem install whenever

或将其添加到您的 GemFile:

gem 'whenever', :require => false

然后运行:

$ cd /apps/my-great-project
$ wheneverize .

希望对你有帮助!

【讨论】:

    【解决方案2】:

    由于您已经在使用 Resque,我建议您使用众多可用的 Resque 插件之一:resque-scheduler。也可以很好地插入 Resque UI。 README 中解释的简单设置。还添加了很多缺少的 DelayedJob 东西(延迟执行)。

    为什么我从whenever切换到resque-scheduler

    • 保留在应用程序文件夹中,不会弄乱您的 cron 文件。
    • 要停止所有“crons”,只需禁用 Resque 工作程序即可。
    • 异常会记录到 Resque UI。
    • 可以通过 Resque UI 手动重新安排。
    • resque-loner 结合使用可以防止在作业花费的时间超过两次执行之间的时间间隔时重复执行。
    • 仍然服从 Resque 的优先系统。
    • 没有额外的启动时间(如果您的应用变得更大,可能需要长达 60 秒),因为它使用 Resque 的工作池。
    • 少用了一个“技术”。
    • 简单开关:配置以类似 cron 的方式完成。

    【讨论】:

    • +1 因为看起来这不会导致每 5 分钟运行一次 rake 测试等环境启动时间。这对我们来说是一个巨大的胜利,我们有很多后台任务。
    【解决方案3】:

    您应该为此类任务使用 cron 作业。

    我建议你使用 Each gem。

    在此处查看 railscast:http://railscasts.com/episodes/164-cron-in-ruby

    【讨论】:

    • 我正在观看 railscast #164,而每当宝石看起来不错。你对这颗宝石有很多好的经验吗?我应该考虑哪些负面因素?
    • 不,这很棒,可以让您以适当的周期安排您需要的任何事情
    • 这看起来像一个伟大的宝石。感谢您的提示。
    • 如果您发现性能正在成为一个问题,如果您有超过 10-20 个任务以相当短的时间间隔运行,那么您也应该真正看看 Marcel 的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 2014-07-03
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多