【问题标题】:How to manage Rufus scheduler at runtime如何在运行时管理 Rufus 调度程序
【发布时间】:2013-09-11 10:34:37
【问题描述】:

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

这是一个好的方法吗?

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

除了“controllers”、“models”、“views”等文件夹...我创建了文件夹“domain”,在其中创建了具有 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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      相关资源
      最近更新 更多