Как запланировать задачу на основе столбца таблицы?

Я использую всякий раз, когда драгоценный камень для запуска рейк-задач. Мой код в schedule.rb выглядит следующим образом.

 every 1.day, :at => '11:00 am' do
  rake "notifications:run_mailer"
 end

Приведенный выше код выполняет задачу rake в 11 утра каждого дня. Теперь я хочу изменить это. Я хочу запустить эту задачу rake на основе столбца таблицы. Для этого я создал таблицу с именем scheduler.rb и столбец run_at. на основе даты и времени столбца run_at мне нужно запустить эту задачу rake. Как это сделать?


person Can Can    schedule 08.10.2014    source источник


Ответы (2)


Шаг 1:

Сначала мы должны загрузить все файлы в schedule.rb Только после этого мы можем выполнять запросы ActiveRecord.

Это можно сделать с помощью приведенной ниже команды

 require File.expand_path(File.dirname(__FILE__) + "/environment")

Шаг 2:

Выполните запрос ActiveRecord и получите время.

  run_at=Scheduler.last.run_at
  time=[run_at.hour.to_s,run_at.min.to_s].join(":")
  every 1.day, :at => time do
    rake "notifications:run_mailer"
  end

шаг 3:

Мы должны обновить всякий раз, когда crontab, используя команду ниже.

 system "whenever --update-crontab"

ключевое слово system используется для запуска команд терминала linux внутри кода rails.

person Can Can    schedule 09.10.2014

Предполагая, что имя таблицы Scheduler:

Scheduler.find(:all).each { |scheduler|
  every 1.day, :at => scheduler.run_at do
    rake scheduler.task_to_run
  end 
}

Обратите внимание, что этот код будет добавлять задачи cron при каждом запуске. Через некоторое время это приведет к огромному количеству cronjobs. Также необходимо добавить дополнительную проверку «была ли задача уже запланирована» должна быть добавлена.

Надеюсь, поможет.

person Aleksei Matiushkin    schedule 08.10.2014
comment
его выбрасывание неинициализированной константы Whenever::JobList::Scheduler - person Can Can; 08.10.2014
comment
Требовать файл с вашим Scheduler классом. - person Aleksei Matiushkin; 08.10.2014
comment
Примечание: find(:all) попытается загрузить все данные сразу, вместо этого используйте: find_each. - person Surya; 08.10.2014
comment
@Surya, это таблица, содержащая cron tasks. Не следует ожидать каких-либо потерь производительности при чтении всего материала в память. - person Aleksei Matiushkin; 08.10.2014
comment
@mudasobwa: Все будет в порядке, если вы уничтожите запись из таблицы, когда задача будет завершена, иначе у вас определенно будет не отвечающий сервер через определенное время. - person Surya; 08.10.2014
comment
@Surya Я не уверен, что понимаю, о чем ты говоришь. find(:all) вернет массив, который будет удален после завершения работы итератора. - person Aleksei Matiushkin; 08.10.2014
comment
Представьте, что вы начинаете планировать 10 заданий в день в таблице планировщиков и не удаляете их после того, как они закончат выполняться, через месяц у вас будет 300, через год 3600 или более, я имею в виду, что через какой-то период времени вы будет слишком много заданий в таблице планировщиков, и загрузка их всех сразу заставит сервер платить своей производительностью. Вместо этого вы всегда должны делать запросы пакетами, чтобы избежать таких инцидентов. - person Surya; 08.10.2014
comment
@Surya А, понял. Проблема на самом деле не в загрузке всей таблицы (ну, я признаю, что в большинстве случаев пакетная загрузка лучше, но не в этом конкретном). Дополнительная проверка, чтобы не планировать уже запланированные задания должны выполняться. Пакетной загрузкой вы собираетесь скрыть проблему, а не решить ее :) - person Aleksei Matiushkin; 08.10.2014
comment
Согласен, я думаю, вам также следует обновить эту информацию в своем ответе. Потому что новые люди, как правило, учатся и внедряют вещи, читая ответы / сообщения, сделанные кем-то опытным, надеюсь, вы поняли мою точку зрения. :) - person Surya; 08.10.2014
comment
я не могу потребовать модель scheduler.rb внутри schedule.rb - person Can Can; 08.10.2014
comment
@AlekseiMatiushkin похоже, что нам не нужно очищать списки crontab, whenever gem уже выполняет внутреннюю очистку, идентифицируя блок на основе пути к файлу расписания внутри файла crontab. - person elquimista; 12.11.2019