如何在运行时管理Rufus调度程序

时间:2013-09-11 10:34:37

标签: ruby-on-rails ruby singleton rufus-scheduler

我使用简单的控制器操作在Ruby中使用Rufus-scheduler安排作业。 后来我想调用另一个动作,在这个动作中,我将取消安排正在执行的作业,直到那个时刻。 当然,我需要在启动和停止调度程序之间可能发生的许多会话期间保持对我的调度程序的引用。 一个显而易见的选择是某种类型的单例类,它将保留对调度程序的引用。

这是一个好的方法吗?

如果是,我的处理方式就是这样......

除了'控制器','模型','视图等文件夹...我创建了文件夹'域'我在其中创建了具有类Rufus :: Scheduler属性的AppConfig单例类。

我的单身人士课程如下:

require 'singleton'
require 'rufus/scheduler'

class AppConfig
  include Singleton

  attr_accessor :scheduler

  def self.instance
    @@instance ||= new
  end

  def initialize
    @scheduler = Rufus::Scheduler.start_new
  end
end

我使用此调度程序的操作是这样的:

        # ...
  # someController
  def start_actions
    scheduler = AppConfig.instance.scheduler

    scheduler.every('30s') do
      SomeModel.some_method
    end

  end

  def stop_actions
    scheduler = AppConfig.instance.scheduler
    scheduler.stop(:terminate => true)
  end

我在这里遗漏了什么吗?这是一个好的方法吗?

1 个答案:

答案 0 :(得分:1)

我用你的方法看到的问题:当你停止调度程序时,@@ instance不会变为nil,所以下次控制器需要一个调度程序时它会得到一个,同一个,停止。

大多数情况下,人们在config / initializers / scheduler.rb中启动调度程序并将其放在全局var(或单例)中。只要Ruby on Rails流程存在,该调度程序就会存在。控制器在调度程序中放置(或删除)作业,它们永远不会停止它。