我可以使用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调度程序线程消失)。