我使用简单的控制器操作在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
我在这里遗漏了什么吗?这是一个好的方法吗?
答案 0 :(得分:1)
我用你的方法看到的问题:当你停止调度程序时,@@ instance不会变为nil,所以下次控制器需要一个调度程序时它会得到一个,同一个,停止。
大多数情况下,人们在config / initializers / scheduler.rb中启动调度程序并将其放在全局var(或单例)中。只要Ruby on Rails流程存在,该调度程序就会存在。控制器在调度程序中放置(或删除)作业,它们永远不会停止它。