2

我从一个简单的控制器操作中使用 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

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

4

1 回答 1

1

我在您的方法中看到的问题:当您停止调度程序时,@@instance 不会变为 nil,因此下次控制器需要调度程序时,它会得到一个相同的调度程序,该调度程序已停止。

大多数时候,人们在 config/initializers/scheduler.rb 中启动一个调度程序,并将其放置在一个全局变量(或单例)中。只要 Ruby on Rails 进程存在,该调度程序就会存在。控制器在调度程序中放置(或删除)作业,它们从不停止它。

于 2013-09-11T12:14:45.700 回答