使用delayed_job重复计划

时间:2011-03-19 21:21:15

标签: ruby-on-rails-3 scheduled-tasks delayed-job

是否可以使用delayed_job执行以下操作:

  1. 定义一个名为Tasks

  2. 的类
  3. 每5分钟后在任务中运行一个方法:Tasks.do_processing

  4. 当下一个5分钟周期出现时,如果上一个 Tasks.do_processing已完成,则仅运行do_processing

  5. 这是我必须自己创建的还是delayed_job(或其他一些gem /插件)可以这样做吗?

    Ps。我知道操作系统级别的cron作业,但是如果我使用它,则意味着每次cron“触发”它都会重新加载整个Rails环境,而delayed_job只需加载一次。

6 个答案:

答案 0 :(得分:5)

您可以考虑创建一个Rake任务或其他类似的独立进程来处理此功能,然后使用Daemons将其包装起来:

  

什么是守护进程?

     

守护进程提供了一种简单的包装方式   现有的ruby脚本(例如a   自编服务器)作为一个   守护进程并由简单控制   启动/停止/重启命令。

     

如果需要,您还可以使用守护进程   在守护进程中运行ruby代码块   过程并控制这些过程   来自主要应用程序。

     

除了这个基本功能,   守护进程提供许多高级功能   例如异常回溯和记录   (如果您的ruby脚本崩溃)和   监控和自动重启   你的流程如果崩溃了。

答案 1 :(得分:5)

如果你想做类似的事情:

class MyJob

  run_every 1.day

  def perform
    # code to run ...
  end

end

然后试用这段代码:https://gist.github.com/1024726

答案 2 :(得分:1)

现在正在制作this版本的DJ 2.1版。没有hackery,使用内置挂钩的延迟作业。只需确保将名为“queue”的列添加到延迟作业表中,我认为这是表格中添加了DJ 3的内容。

答案 3 :(得分:1)

我想可以补充一点,delayed_job_recurring宝石是@ kares答案的要点的延伸。

用法示例:

class MyTask
  include Delayed::RecurringJob
  run_every 1.day
  run_at '11:00am'
  timezone 'US/Pacific'
  queue 'slow-jobs'
  def perform
    # Do some work here!
  end
end

并安排它。在rails应用程序中,您可以将其放在初始化程序中:

MyTask.schedule!

答案 4 :(得分:0)

答案 5 :(得分:0)

您可以使用https://github.com/codez/delayed_cron_job这是一个延迟作业插件来设置定期作业。