我使用 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/