ruby-on-rails - 如何在运行时管理 Rufus 调度器

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

我使用 Ruby 中的 Rufus-scheduler 从一个简单的 Controller Action 中安排了一个作业。 稍后我想调用另一个 Action ,在该 Action 中我将取消安排直到那一刻之前正在执行的作业。 当然,在启动和停止调度程序之间可能发生的许多 session 期间,我需要保持对我的调度程序的引用。 一个明显的选择是某种类型的单例类,它会保留对调度程序的引用。

这是一个好的方法吗?

如果是,我是这样处理的...

除了“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

我是不是漏掉了什么?这是一种可行的方法吗?

最佳答案

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

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

关于ruby-on-rails - 如何在运行时管理 Rufus 调度器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18738850/

相关文章:

ruby-on-rails - 在安装了 rvm 的 ubuntu 上成为 root 后,Ruby 回退到旧版本

ruby-on-rails - Windows 7 64 位 : Could not find a valid gem 'compass' (>= 0), 这里就是为什么 : Unable to download data from https://rubygems. org/

javascript - 如何测试支持 javascript 和不支持 javascript 的场景?

ruby-on-rails - 如何捕获 "undefined method ` [ ]' for nil:NilClass"错误?

ruby-on-rails - 根据父属性验证子项

c# - 为什么我的单例有两个不同的实例?

ruby-on-rails - 强参数 has_many 通过

java - Android 在 Galaxy Note 上的 Activity (单例)之间传递数据不起作用

JavaScript 'class' 和单例问题

ruby-on-rails - 如何让序列化器不包含仅用于特定方法的关联表?