Сохранение заданий rufus-scheduler после перезагрузки сервера - PullRequest
0 голосов
/ 29 апреля 2018

Заявка

Я пишу приложение, которое запускает планировщик и извлекает записи после того, как кто-то сохраняет запись в базе данных.

Инициализаторы / 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

Задача

Задание запускается с контроллера, но проблема в том, что при перезапуске сервера задание теряется.

Я прочитал файл readme для rufus-scheduler, и упоминается, что он не является функцией. Но все же я хочу знать, есть ли какое-либо решение для этого (сохранение заданий после перезагрузки сервера) или мне нужно изменить свой подход?

P.S. Я искал его при переполнении стека, но мне жаль, если я что-то пропустил или пропустил аналогичный вопрос.

EDIT

Для всех тех, кто хочет запустить планировщик из самого контроллера, используя params, подумайте о стратегии сохранения данных в БД (временная таблица или что-то в этом роде), если это возможно, и затем связывание события create с планированием. Перепланируйте задания по инициализации планировщика, т. Е. Перезагрузите сервер, как указано в ответе @jmettraux. Надеюсь, это поможет.

1 Ответ

0 голосов
/ 30 апреля 2018

Вы правы, руфус-планировщик не привязан ни к какому постоянству.

Поскольку вы уже привязываете записи к расписанию (планируя работу для каждого создаваемого объекта), почему бы вам просто не перепланировать время при перезапуске приложения?

Что-то вроде (псевдокод выровнен по вашему):

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
...