3

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

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

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

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

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

这个解决方案有意义吗?它是否有助于避免为每个作业启动一个新的 Rails 环境?..还是有更好的方法来做到这一点?

--

运行导轨 3

4

3 回答 3

4

您当然可以考虑通过 cron 将延迟作业排入队列,然后让一个长时间运行的延迟作业工作人员。

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

您可能还想查看clockwork.rb,这是一个长时间运行的进程,它会做与您使用cron 相同的事情(排队延迟作业):http ://rubydoc.info/gems/clockwork/0.2.3 /帧

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

于 2011-06-04T00:10:08.377 回答
0

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

  1. 将我的 rake 代码移动到适当的模型
  2. 添加了用于从浏览器调用模型方法的控制器/路由代码
  3. 使用 gem 配置的 cronjobswhenever运行command 'curl mywebsite.com/model#method'

我尝试尝试过delayed_job,但不喜欢运行另一个Rails 实例的想法。我的方法不是服务器密集型的,上面的解决方案允许我利用已经运行的 Rails 环境。

于 2011-06-09T22:13:24.160 回答
0

从 schedule.rb 注释这一行

require File.expand_path(File.dirname(__FILE__) + "/environment")

而是仅加载所需的 ruby​​ 文件,例如您的案例中的模型。

于 2016-12-21T12:58:06.057 回答