Rails:每当+ delayed_job优化rake任务?

时间:2011-06-03 18:33:15

标签: ruby-on-rails cron rake delayed-job whenever

我使用每次来全天调用rake任务,但每个任务都会启动一个新的Rails环境。如何在不重新启动每个作业的Rails的情况下全天运行任务?

这是我想出的,希望得到一些反馈......?

  1. 将每个rake任务重构为相应模型中的方法。

  2. 使用 delayed_job gem分配低优先级并确保这些方法异步运行。

  3. 指示每当调用每个Model.method而不是调用rake任务

  4. 这个解决方案有意义吗?它是否有助于避免为每个作业启动新的Rails环境? ..或者有更好的方法吗?

    -

    运行Rails 3

3 个答案:

答案 0 :(得分:4)

你当然可以考虑通过cron排队delayed_jobs,然后让一个长期运行的delayed_job工作者。

然后您可以使用whenever来帮助您创建delayed_job排队方法。让whenever的cron输出调用一个小的包装脚本可能最容易,它直接加载active_record和delayed_job而不是整个rails堆栈。 http://snippets.aktagon.com/snippets/257-How-to-use-ActiveRecord-without-Rails

你可能也想看一下clockwork.rb,这是一个长期运行的过程,你会使用cron做同样的事情(排队delayed_jobs):http://rubydoc.info/gems/clockwork/0.2.3/frames

您也可以尝试在delayed_jobs中使用重新排队策略:https://gist.github.com/704047

答案 1 :(得分:0)

这个问题有很多很好的解决方案,我最终最终整合了这个问题:

  1. 将我的佣金代码移至相应的模型
  2. 为从浏览器调用模型方法添加了控制器/路由代码
  3. 使用whenever gem配置cronjobs以运行command 'curl mywebsite.com/model#method'
  4. 我尝试给予delayed_job一个但是不喜欢运行另一个Rails实例的想法。我的方法不是太耗费服务器,上面的解决方案允许我利用已经运行的Rails环境。

答案 2 :(得分:0)

从schedule.rb

评论此行
require File.expand_path(File.dirname(__FILE__) + "/environment")

而是只加载所需的ruby文件,例如你的模型中的模型。