我使用每次来全天调用rake任务,但每个任务都会启动一个新的Rails环境。如何在不重新启动每个作业的Rails的情况下全天运行任务?
这是我想出的,希望得到一些反馈......?
将每个rake任务重构为相应模型中的方法。
使用 delayed_job gem分配低优先级并确保这些方法异步运行。
指示每当调用每个Model.method而不是调用rake任务
这个解决方案有意义吗?它是否有助于避免为每个作业启动新的Rails环境? ..或者有更好的方法吗?
-
运行Rails 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)
这个问题有很多很好的解决方案,我最终最终整合了这个问题:
whenever
gem配置cronjobs以运行command 'curl mywebsite.com/model#method'
我尝试给予delayed_job一个但是不喜欢运行另一个Rails实例的想法。我的方法不是太耗费服务器,上面的解决方案允许我利用已经运行的Rails环境。
答案 2 :(得分:0)
从schedule.rb
评论此行require File.expand_path(File.dirname(__FILE__) + "/environment")
而是只加载所需的ruby文件,例如你的模型中的模型。