Необходимо запустить задание в определенное время

#ruby-on-rails #ruby-on-rails-3 #heroku

#ruby-on-rails #ruby-on-rails-3 #heroku

Вопрос:

Я пытаюсь создать задание, чтобы отправить уведомление на вызов Twilio, поэтому важно иметь надежное решение, которое может гарантировать, что задания выполняются в определенное время (я не думаю, что помещение в очередь является достаточно точным).

Какое наилучшее решение для такого типа задач?

Эти уведомления должны появляться в определенное время вызова. Например, «осталась 1 минута». Поэтому он должен иметь возможность:

  1. Запускайте в произвольное время (13:22 или 14:45)
  2. Определяется пользовательским вводом (они устанавливают время вызова)

(Было бы неплохо, если бы это решение могло выполняться на Heroku)

Ответ №1:

Вы можете использовать Heroku cron для выполнения заданий ежедневно или ежечасно.

Ежедневный cron бесплатный, почасовой cron стоит 3 доллара в месяц: http://addons.heroku.com/cron .

Обычно cron выполняется при первом запуске (т. Е. Если вы настроили его на 15:00, оно будет выполняться в 15:00 каждый день), но вы можете изменить это, отправив электронное письмо на support@heroku.com .

Чтобы запустить код в cron, добавьте свой код в cron.rake файл и ознакомьтесь с документами cron здесь.

К вашему сведению

Собственные образцы Heroku для cron предлагают выполнять проверку времени, т.Е.

 if Time.now.hour % 4 == 0 # run every four hours
  ...
  

Но, если вы запускаете ежедневный cron, код будет выполняться в то время, когда, скорее всего, произойдет сбой вышеуказанного условия. Итак, если вы не платите за почасовую работу cron и хотите, чтобы она выполнялась только в течение определенных часов, оставьте эту часть их примера кода и просто включите свой собственный код обычным образом.

Выполняется в определенное время

Попробуйте использовать столбец delayed_job ‘s :run_at , который может дать вам гибкость, необходимую для выполнения заданий в строго определенное время.

Heroku Docs:http://devcenter.heroku.com/articles/delayed-job

Комментарии:

1. Это не сработает, если я пытаюсь отправить уведомление в вызове. Должна быть возможность выполнения поминутно (я обновлю свой вопрос, чтобы он был более понятным)

2. К вашему СВЕДЕНИЮ — надстройка, упомянутая в этом ответе, теперь называется heroku scheduler

Ответ №2:

Для этого вам нужно добавить cronjob. Если вы используете Linux, вы можете добавить cron в crontab и указать время, в которое оно выполняется. Это очень гибко. Вы можете найти подробности здесь:
http://en.wikipedia.org/wiki/Cron

Если вы хотите сделать это способом ruby, попробуйте всякий раз, когда gem:
https://github.com/javan/whenever

Комментарии:

1. Разве это не требует, чтобы вы знали время до раздачи? Или вы можете произвольно настроить его?

2. Если вы хотите запускать cron в произвольное время, то вы можете написать другой cron, который продолжает обновлять crontab с новым произвольным временем. Cron, который обновляет crontab, должен запускаться чаще, скажем, каждые 1 или 5 минут, и он добавляет запись для нового произвольного времени. Вам нужно будет написать другой cron для очистки crontab (выполненных cron), и он может запускаться один раз в день. Я надеюсь, вы поняли подход.

3. Следует придерживаться описанного выше подхода, если вы понятия не имеете, когда будет запущен cron, и время генерируется где-то в коде. Если вы можете решить, что оно выполняется на 7-й день, 2-й час каждого месяца и т.д. и т.п., Тогда вам следует взглянуть на примеры cron. Они очень, очень гибкие, и вы можете достичь любого времени, используя различные комбинации. Вероятно, вам нужно пересмотреть свой подход. Вы могли бы сбросить все эти записи в таблицу с отметкой времени (когда выполнять), и cron запускается каждые 1 минуту и отправляет уведомления, где (временная метка — Time.now) < пороговое значение. Пороговое значение также может быть в базе данных.

Ответ №3:

Для конкретного случая, который вы упомянули, я думаю, вам следует попробовать delayed_job:
https://github.com/collectiveidea/delayed_job#readme

в нем есть опция run_at, где вы можете указать время, в которое вы хотите запустить задание.

Ответ №4:

Перейдите к заданиям cron в панели управления хостингом