在Rails环境中运行计划任务的最佳方法是什么?脚本/跑步吗?耙?我想每隔几分钟运行一次任务。
当前回答
最好的方法可能是使用rake来编写所需的任务,然后通过命令行执行它。
你可以在railscasts看到一个非常有用的视频
也可以看看其他资源:
Rails Rake教程
其他回答
使用Sidekiq或Resque是一种更加健壮的解决方案。它们都支持重试作业、使用REDIS锁的排他性、监控和调度。
请记住,Resque是一个死项目(没有积极维护),所以Sidekiq是一个更好的选择。它的性能也更高:Sidekiq在单个多线程进程上运行多个worker,而Resque在单独的进程中运行每个worker。
使用Craken(以rake为中心的cron作业)
假设您的任务不需要太长时间来完成,只需为每个任务创建一个带有操作的新控制器。将任务的逻辑实现为控制器代码,然后在操作系统级别上设置一个cronjob,该cronjob使用wget以适当的时间间隔调用该控制器的URL和动作。这种方法的优点是:
拥有对所有Rails对象的完全访问权,就像在普通控制器中一样。 可以像进行正常操作一样进行开发和测试。 也可以调用你的任务adhoc从一个简单的网页。 不要通过启动额外的ruby/rails进程来消耗更多的内存。
我最近为我一直在做的项目创建了一些cron作业。
我发现宝石发条非常有用。
require 'clockwork'
module Clockwork
every(10.seconds, 'frequent.job')
end
你甚至可以使用这个宝石来安排你的后台工作。 有关文档和进一步帮助,请参阅https://github.com/Rykian/clockwork
我不太确定,我猜这取决于任务:多长时间运行一次,有多复杂,需要与rails项目进行多少直接交流等等。我想如果做一件事只有“一种最好的方法”,就不会有那么多不同的方法了。
在我在Rails项目中的上一份工作中,我们需要制作一个批量邀请邮件(调查邀请,而不是垃圾邮件),它应该在服务器有时间的时候发送计划好的邮件。我认为我们将使用守护进程工具来运行我创建的rake任务。
不幸的是,我们公司遇到了一些资金问题,被主要竞争对手“收购”了,所以这个项目一直没有完成,所以我不知道我们最终会用什么。
推荐文章
- Rails:如何在Rails 4中引用CSS中的图像
- 如何使用RSpec的should_raise与任何类型的异常?
- Rails -嵌套包括活动记录?
- Delete_all vs destroy_all
- Rails获取“each”循环的索引
- 如何通过脚本创建crontab
- 在rails redirect_to中传递参数
- Rails new vs create
- Rails has_many的别名
- Ruby:包含的反义词是什么?Ruby数组?
- 想要在Rails中找到没有关联记录的记录
- helper和helper_method做什么?
- 如何回滚只是一个步骤使用耙db:迁移
- 如何传递参数到一个Rake任务与环境在Rails?
- 如何在Rails中计算相对时间?