我可以使用rufus-scheduler在rails中调度控制器方法吗?

时间:2014-03-10 23:56:11

标签: ruby-on-rails rufus-scheduler

我可以从下面发布的控制器安排索引方法吗?如果是这样,我将如何做到这一点?

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

2 个答案:

答案 0 :(得分:2)

所以你似乎有一个数字模型。第一步是将逻辑从控制器移动到模型:

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开发人员课程。请意识到有人在这里帮助你,而不是免费完成你的工作。

答案 1 :(得分:0)

首先需要初始化一个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-scheduler线程消失)。