我可以使用rufus-scheduler在rails中调度控制器方法吗?
我可以从下面发布的控制器安排索引方法吗? 如果是这样,我该怎么做呢?
class WelcomeController < ApplicationController def index if Number.find(1) @number = Number.first @number.value += 1 @number.save else @number = Number.new @number.value = 0 end end end
所以你似乎有一个数字模型。 第一步是将逻辑从控制器移动到模型:
class Number def self.increment n = nil if Number.find(1) n = Number.first n.value += 1 n.save else n = Number.new n.value = 0 end n end end
你的控制器就变成了
class WelcomeController < ApplicationController def index @number = Number.increment end end
然后,也可以从调度程序调用此“增量”类方法。 像:
# file: # config/initializers/scheduler.rb require 'rufus-scheduler' # Let's use the rufus-scheduler singleton # s = Rufus::Scheduler.singleton # Stupid recurrent task... # s.every '10m' do Number.increment end
现在,如果这个答案也超出了你的想法,请考虑注册Rails开发人员课程。 请意识到有人在这里帮助你,而不是免费做你的工作。
首先,您需要初始化一个rufus-scheduler实例。 这通常在Rails初始化程序中完成:
# config/initializers/scheduler.rb require 'rufus-scheduler' # Let's use the rufus-scheduler singleton # s = Rufus::Scheduler.singleton # Stupid recurrent task... # s.every '1m' do Rails.logger.info "hello, it's #{Time.now}" end
然后,您的控制器可以使用rufus-scheduler实例,如下所示:
class ScheController < ApplicationController def index job_id = Rufus::Scheduler.singleton.in '5s' do Rails.logger.info "time flies, it's now #{Time.now}" end render :text => "scheduled job #{job_id}" end end
这适用于Webrick和Thin,但需要使用Passenger或Unicorn进行一些调整(防止多个调度程序和/或防止初始rufus调度程序线程消失)。