【问题标题】:Making rufus-scheduler jobs persist after a server reboot在服务器重新启动后使 rufus-scheduler 作业持续存在
【发布时间】:2018-04-29 08:55:32
【问题描述】:

应用程序

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

initializers/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

controllers/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 的自述文件,并提到它是一个非功能。但我仍然想知道是否有任何解决方案(在服务器重新启动后保留作业)还是我必须改变我的方法?

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

编辑

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

【问题讨论】:

    标签: ruby-on-rails rufus-scheduler


    【解决方案1】:

    你是对的,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
    

    【讨论】:

    • 是的,这可以做到。实际上,我最初的计划是使用参数从控制器运行调度程序。不需要数据库存储。但之后,我想我可以使用一张桌子。从控制器运行调度程序的原始问题一直困扰着我,我没有关注改变的场景。谢谢您的回答。 :)
    猜你喜欢
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多