【问题标题】:Recurring schedule using delayed_job使用delayed_job 的重复计划
【发布时间】:2011-07-18 21:50:36
【问题描述】:

是否可以使用delayed_job做以下事情:

  1. 定义一个名为Tasks的类

  2. 让 Tasks 中的方法每 5 分钟运行一次:Tasks.do_processing

  3. 当下一个 5 分钟周期到来时,如果 上一个 do_processing 已完成,则运行 Tasks.do_processing only

这是我必须自己创建的东西还是可以延迟_job(或其他一些 gem/插件)这样做?

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

【问题讨论】:

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


【解决方案1】:

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

什么是守护进程?

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

如果你愿意,你也可以使用守护进程 在守护进程中运行 ruby​​ 代码块 过程并控制这些过程 来自主应用程序。

除了这个基本功能, 守护进程提供了许多高级功能 像异常回溯和日志记录 (以防您的 ruby​​ 脚本崩溃)和 监控和自动重启 如果它们崩溃,您的进程。

【讨论】:

  • 拒绝投票,因为该库的名称选择不当,使得文档难以阅读和理解它在做什么。这就像将您的数据库接口库命名为“驱动程序”。
  • @Leopd:Brandon 的错在哪里?
  • @Sergio 我的投票表明,出于上述原因,我认为答案没有描述解决 OP 中问题的有用方法。它只是关于布兰登,因为他写了它。 SO 投票的目的是为所述问题组织最佳解决方案。
【解决方案2】:

【讨论】:

    【解决方案3】:

    如果你想做类似的事情:

    class MyJob
    
      run_every 1.day
    
      def perform
        # code to run ...
      end
    
    end
    

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

    【讨论】:

      【解决方案4】:

      一段时间以来一直在为 DJ 2.1 使用 this 的版本。没有骇客,使用内置挂钩的延迟作业。只需确保将名为“队列”的列添加到延迟作业表中,我相信这是 DJ 3 无论如何都添加到表中的。

      【讨论】:

      • 这看起来很适合在特定时间安排作业(在您的示例中为凌晨 2 点 UTC),这与 OP 所要求的并不完全相同:每五分钟运行一次任务,例如在 12:05、12:10、12:15 等,除非之前的实例仍在运行。我可以将self.time_to_recur 设置为Time.now + 5 minutes,但这只会在当前实例完成时重新排队,所以这不是一个确切的时间表。此外,工作之间总会有五分钟的间隔,因此无需检查job_exists?
      • time_to_recur 设置为“Time.now + 5.minutes”。有时我只想要一个工作实例,这使得job_exists? 非常有用。
      【解决方案5】:

      我想我可能会补充一点,delayed_job_recurring gem 是@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!
      

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-01-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-11
          • 1970-01-01
          • 2012-09-08
          相关资源
          最近更新 更多