gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:29:16 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com