服务器重启后,rufus-scheduler作业仍然存在

时间:2018-04-29 08:55:33

标签: ruby-on-rails rufus-scheduler

应用

我正在编写一个运行调度程序的应用程序,并在有人将条目保存到数据库后获取记录。

初始化/ scheduler.rb

require 'rufus-scheduler' 


SCHEDULER = Rufus::Scheduler.new(:lockfile => ".rufus-scheduler.lock")
unless SCHEDULER.down?

  # SCHEDULER.every '3m', :tags => 121 do
  #   Rails.logger.info "Ping!!"
  #     Rails.logger.flush
  # end

end

控制器/ abc_controller.rb

class AbcController < ApplicationController

  def new
    obj = ModelClass.new(params)
    if obj.save
      SCHEDULER.every obj.frequency do
        # run a job
      end
    end
  end

end

问题

作业从控制器启动,但问题是当服务器重新启动时作业丢失。

我已经阅读过rufus-scheduler的自述文件,并提到它是一个非功能。但我仍然想知道是否有任何解决方案(在服务器重启后保留作业)或者我是否必须改变我的方法?

P.S。我在堆栈溢出时搜索了它,但如果我遗漏了任何内容或错过了类似的问题,我很抱歉。

修改

对于想要使用params从控制器本身运行调度程序的所有人,如果可能,请考虑将数据保存在db(临时表或其他内容)中的策略,然后将create事件与调度绑定。在调度程序初始化时重新调度作业,即@jmettraux在答案中提到的服务器重启。希望这会有所帮助。

1 个答案:

答案 0 :(得分:0)

你是对的,rufus-scheduler不依赖于任何持久性。

由于您已经将记录绑定到计划(通过为每个创建的对象安排作业),为什么不在应用程序重新启动时重新计划?

像你这样的伪代码对象:

require 'rufus-scheduler'


SCHEDULER = Rufus::Scheduler.new(:lockfile => ".rufus-scheduler.lock")

unless SCHEDULER.down?

  ModelClass.all.each do |obj|
    SCHEDULER.every obj.frequency do
      # the job
    end
  end
end