`

Rails Cron 一个Rails的定时执行插件介绍

阅读更多


   定时任务,Linux下cron准确的实现这个功能。通常,在Rails开发中,我们也遇到类似的需要,例如,我自己就在开发过程中,有这样一个需要:

   有一个专业逻辑的报表查询,表结果如下:
CREATE TABLE  `production`.`datalogs` (
  `id` int(11) NOT NULL auto_increment,
  `ts` datetime default NULL,
  `sample_count` int(11) default NULL,
  `attenuation` float default NULL,
  `start_freq` int(11) default NULL,
  `stop_freq` int(11) default NULL,
  `min_val` float default NULL,
  `val` float default NULL,
  `max_val` float default NULL,
  `image` blob,
  `min_image` blob,
  `max_image` blob,
  `site_id` int(11) default NULL,
  `noise_floor` float default NULL,
  PRIMARY KEY  (`id`),
  KEY `site_ts_idx` (`site_id`,`ts`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


   其中,主要的数据是blob结构的image数据。由于数据量比较大往往生产报表的速度很慢,所以,我们为了优化性能,采用了很多不同的办法。例如,用mysql function代替ruby的逻辑运算(以后的文章会具体描述这个优化的实现,和包括udf的调试),例如,简单的zip压缩,还例如,Flex端的显示。当然,也包括,分段压缩。

    道理上讲,用户不会关心半个月之前的,某天里几秒的具体数据。比如,2:20 到3:20的数据。所以,我们就把半月之前的数据压缩成了一个,每天一条记录。这样就大大提高了运行速度。但这就需要定时任务了。

    Rails定时任务,实现有很多不同的选择。用linux的cron job显然是比较大众的选择,后面我也会用专门的文章介绍,我是怎么用的和使用过程的一些问题。然而,linux的cron job也有一些问题:

  1. 启动时会明显的占用资源,这里指需要加载Rails环境
  2. 同步后台定时进程,需要比较大的内存
  3. 很难从Rails的项目来管理,定时的后台进程,多数是数据库交互



  而RailsCron插件就很好通过RoR实例来执行定时任务,同时较好的解决上面linux Cron job带来的问题。典型的RailsCron插件这样使用:
RailsCron的安装

ruby script/plugin#插件安装

并创建一个rails_crons的表

RailsCron的调用
RailsCron.create(
  :command => "Object.do_something()", 
  :start => 2.minutes.from_now,
  :every => 12.hours,               # default: 1.day 
  :finish => 2.years.from_now       # optional
)
RailsCron.destroy_all
RailsCron.find_by_command "some_command"




使用 ACTS_AS_BACKGROUND定义需要执行定时任务的ActiveRecord

    添加ACTS_AS_BACKGROUND的描述以便可以后台执行。如下:
class EmailQueue << ActiveRecord::Base
    background :deliver, :every => 1.minute, :concurrent => true
enddef self.deliver
    #process the queue
end


RailsCron的定制参数


  • :sleep—执行的间隔频率,默认:1秒
  • :db_sleep—访问数据库的间隔频率,默认:1秒


RailsCron的启动与停止

    RailsCron通过Rake启动和停止,具体命令如下:

  • cron_start—以守护进程(daemon)启动RailsCron
  • cron_foreground—以前台启动启动RailsCron
  • cron_stop—安全停止
  • cron_kill
  • cron_graceful—安全重启
  • cron_status


以上命令是linux下使用,Windows用户需要使用
ruby script\runner ‘RailsCron.start’

运行和Ctrl-C停止

环境变量的设置:

  • RAILSCRON_SUDO—后台进程将以如下指定用户身份运行,默认不使用。
  • RAILS_ENV—Default: 默认环境development



注释:该文参考原插件说明的readme和相关文章
2
0
分享到:
评论
3 楼 paolongtao 2009-10-28  
我也是google到了你的文章和其他文章,发现的问题

那么现在间歇性任务(比如6个小时一次,抓去用户的博客),应该怎么弄?
2 楼 夜鸣猪 2009-10-28  
 

十分感谢回复,省了有人被我误导啊
1 楼 paolongtao 2009-10-28  
RailsCron 的作者在其 Blog 上解释了为什么。作者推荐使用 daemon_generator 与 backgroundRb 。下面是原文:

RailsCron Deprecation

Ok, so here's the deal. RailsCron is still available, but in the not_supported folder of my svn.

Why?

   1. RailsCron is threaded, which causes all kinds of nightmares when Rails isn't threadsafe.
   2. All of RailsCron's functionality is available in BackgroundRb (which is threaded too, ymmv).
   3. RailsCron's daemonization isn't terribly Capistrano-friendly
   4. I wrote daemon_generator, which allows you to easily incorporate your own daemons into Rails. It's minimal, and it's what I actually use. Focusing on the daemons, without coupling messaging and database dependence, is the way to go for me.

If you want bare-bones, stable, and functional, use daemon_generator. If you want messaging and features, use backgroundRb. I don't see value in RailsCron anymore.

原文地址:http://www.kylemaxwell.com/
my4java 发表于:2006.09.14 16:20 ::分类: ( Rails散文 ) ::阅读:(454次) :: 评论 (0) :: 引用 (0)

相关推荐

    计划任务Cron表达式生成

    Cron表达式的每个字段可以是一个具体的值、一个范围、一个列表、一个通配符(*)或者是一个步进值(如“/5”每隔5单位时间)。通配符*代表所有可能的值,例如"*/5 * * * *"表示每5分钟执行一次。步进值可以与范围或...

    Rails3 使用rake启动后台任务

    4. **Delayed Job (DJ)**: DJ 是一个流行的 Rails 插件,用于处理后台任务。它将任务放入数据库队列,然后在后台进程(如 worker)中执行。要使用 DJ,首先需要安装 gem,然后配置数据库连接,最后创建并运行 worker...

    crono:Rails的基于时间的后台作业调度程序守护程序(就像Cron一样)

    Crono-Rails的工作计划程序 Crono是Ruby on Rails的基于时间的后台作业调度程序守护程序(就像Cron一样)。 目的 当前,还没有Ruby Cron for ...它将创建一个配置文件config/cronotab.rb并进行迁移运行迁移: rake

    ruby中执行周期性任务(定时任务)的3种方法

    Whenever是一个基于Linux的cron服务的gem,它将Ruby代码转换为cron脚本,从而让cron负责执行周期性任务。在Windows平台上,由于缺少cron服务,whenever无法直接使用。以下是如何使用whenever的步骤: - 首先,通过...

    active-elastic-job:在Amazon Elastic Beanstalk工作人员环境中运行Rails后台作业或定期任务(cron作业)。 无需定制的容器命令

    它为Rails的框架提供了一个适配器,使您的应用程序可以将作业作为消息在队列中排队。 Elastic Beanstalk提供了可自动从队列中提取消息并将其转换为HTTP请求的。 这个宝石知道如何处理这些请求。 它带有一个中间件,...

    sidekiq-cron:Sidekiq作业的调度程序Cron

    仅在至少运行一个Sidekiq进程时才添加调度作业,但是在运行多个Sidekiq进程或节点的环境中使用Sidekiq-Cron是安全的。 如果您想了解调度的工作原理,请查看 与ActiveJob配合使用(Rails 4.2+) 您不需要Sidekiq ...

    schedule_cron

    例如,如果你想在每天的凌晨1点运行一个任务,你可以在`config/schedule.rb`中写入: ```ruby every 1.day, at: '1:00 am' do command "rake your_task" end ``` 然后运行`whenever --update-crontab`命令,将...

    dj_cron:轻松地从cron入队延迟的工作

    安装将此行添加到您的应用程序的Gemfile中: gem 'dj_cron'然后执行: $ bundle或将其自己安装为: $ gem install dj_cron用法在Rails项目目录中,运行: bundle exec djc-enqueue FooJob BarJob ...FooJob和BarJob...

    fugit:Ruby,rufus-scheduler和flor的时间工具(cron,解析,持续时间等)

    解析cron表达式并计算给定日期之后的下一次出现 ice_cube -Ruby日期重复库 ISO8601 -Ruby解析器可与ISO8601 dateTimes和持续时间一起使用 ... 使用fugit的项目 arask- “自动RAils任务”使用fugit解析cron字符串 ...

    rufus-scheduler:Ruby的调度程序(at,in,cron和每个作业)

    Ruby的作业调度程序(at,cron,in和每个作业)。 它使用线程。 注意:也许您正在寻找的? (特别是如果你使用这是上鲁弗斯调度2.0.24) 快速开始: # quickstart.rb require 'rufus-scheduler' scheduler = ...

    Gitlab备份恢复与迁移.doc

    或者,直接定时执行一个脚本 `auto_backup.sh`,脚本内容为: /opt/gitlab/bin/gitlab-rake gitlab:backup:create CRON=1 然后,在 `/etc/crontab` 中添加相关任务,定时执行 `auto_backup.sh` 脚本文件。 二、...

    docker-rails:具有ActionCable,Webpacker,Stimulus,Elasticsearch,Sidekiq的Dockerize Rails 6

    该应用程序是一种非常简单的CMS(内容管理系统),可以管理帖子。 除了无聊的功能外,它还具有一些非默认功能。 该项目旨在构建用于生产的精益Docker映像。 因此,它基于官方的Alpine Ruby图像,使用了多阶段构建和...

    collection_guides:一个Ruby on Rails应用程序,用于展示使用从ArchivesSpace导入的数据的档案查找辅助工具

    一个用于显示档案查找辅助工具的Ruby on Rails应用程序,该应用程序使用从ArchivesSpace导入的数据。 用于《 NC州立大学图书馆特别馆藏研究中心馆藏指南》( )。 通过Apache Solr提供了跨查找辅助工具的搜索。 要求...

    idonethat:iDoneThis 克隆 Heroku 就绪 Ruby on Rails

    完成了 Heroku 准备好 Ruby on Rails iDoneThis 克隆。... heroku addons:open scheduler以安排bundle exec cron:prompt和bundle exec cron:digest每天一次 有关可配置变量的列表,请参阅config/settings.yml

    myapp_on_heroku:这是我的第一个应用程序,已成功部署到heroku

    此外,Heroku还支持配置环境变量(如数据库连接字符串),使用`heroku config:set`命令,以及运行后台任务(如定时任务)通过Heroku的作业系统(如cron jobs)。对于初学者来说,理解如何在Heroku上部署和管理Rails...

    gitlab备份恢复手册

    通过以上三个部分的详细介绍,我们可以了解到如何配置GitLab备份目录路径、执行手动备份以及自动化备份,并且在必要时如何进行恢复操作。这些步骤对于维护GitLab系统的稳定性和安全性具有重要意义。

    sidecloq:Sidekiq的定期定期Cron作业扩展

    Sidecloq 周期性/定期/计划/ Cron作业扩展 为什么 使用Sidekiq运行定期任务有多种选择,包括 , 以及 。 每个人解决问题的方式略有不同。... 领导者选举确保只有一个流程可以入队,并且如果当前领导者去世,则会

    Laravel开发-support

    "Laravel开发-support setranmedia autoblog框架支持库"这个标题表明我们正在讨论一个专门为Laravel开发定制的扩展库,这个库由setranmedia创建,用于支持autoblog功能。下面我们将深入探讨Laravel开发、support库...

    moonshine_sphinx:安装和配置狮身人面像

    一个插件,用于使用thinking_sphinx为Rails应用程序安装和管理sphinx。 它处理: 确保安装了狮身人面像 为您生成合理的sphinx.yml 用上帝管理和监视搜索 添加capistrano挂钩以重新启动部署时搜索 (可选)添加...

    联欢晚会:一个用于媒体丰富案例研究的教学平台

    联欢晚会是一个用于协作研究媒体丰富的教学案例的平台。 安装与设定 您需要在本地安装以下先决条件才能运行Gala: Ruby 2.6.1 Rails v6.0.0.beta3 PostgreSQL&gt; = v9.6.17(对于MacOS,建议将作为一键安装) ...

Global site tag (gtag.js) - Google Analytics