ruby-on-rails - 使 rufus-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 的自述文件,并提到它是一个非功能。但是我仍然想知道是否有任何解决方案(在服务器重新启动后保留作业)还是我必须改变我的方法?
PS 我在堆栈溢出时搜索了它,但如果我错过了任何内容或错过了类似的问题,我很抱歉。
编辑
对于所有想要使用参数从控制器本身运行调度程序的人,如果可能,请考虑将数据保存在数据库(临时表或其他东西)中的策略,然后将创建事件与调度绑定。在调度程序初始化时重新安排作业,即@jmettraux 的答案中提到的服务器重新启动。希望这可以帮助。
解决方案
你是对的,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
推荐阅读
- flask - Flask Mail:如何为发件人添加自定义名称?
- sql - 如何将单词附加到文件中的一行而不移动到下一行-?
- python - 如何使用新定义的变量更新 tkinter 窗口?
- scala - 如何使用 Scala 反射来查找特征的所有子类(不使用第三方工具)?
- node.js - 使用 Puppeteer 打开的站点比通常的 Chrome 浏览器慢得多
- time-series - 如何设计时间序列测量(表格)
- html - 仅在小屏幕尺寸上应用类
- reactjs - 为什么第一个 SetState 总是受到影响,而第二个没有反应原生?
- c# - 从默认构造函数在静态类中添加实例类时出现 Stack-Overflow 异常
- tensorflow - CUB 减少错误无效的配置参数 [[{{node FUllYConnected_1/weight_regularizer/Sum}}]] [[{{node metrics/acc/Mean}}]]