Как вы вызываете метод каждый час в Rails? - PullRequest
6 голосов
/ 23 мая 2011

Я использую Resque с Redis для обработки фонового задания.Я бы хотел вызывать метод Resque.enqueue (MyModel) только один раз в час для выполнения фоновой задачи.

Например: скажем, у меня есть сайт с 10 000 пользователей.Я хотел бы вызывать этот метод только 24 раза в день;не 10000 * 24. Пример метода ниже:

Resque.enqueue(MyModel)

Спасибо за вашу помощь заранее.Я должен также упомянуть, что я предпочитаю придерживаться Resque, а не переходить на Delayed Job.Спасибо.

Ответы [ 3 ]

6 голосов
/ 23 мая 2011

Для такого рода задач вы должны использовать задание cron.

Я предлагаю вам использовать камень Everyever.

См. Railscast здесь: http://railscasts.com/episodes/164-cron-in-ruby

3 голосов
/ 23 мая 2011

Поскольку вы уже используете Resque, я бы рекомендовал использовать один из многих доступных плагинов Resque: resque-scheduler .Также очень хорошо подключается к Resque UI.Простая настройка, как описано в README.Также добавляет много недостающих вещей DelayedJob (отложенное выполнение).

Почему я переключился с whenever на resque-scheduler:

  • Остается в папке приложения и не 'не связывайтесь с вашим файлом cron.
  • Чтобы остановить все «кроны», просто отключите работников Resque.
  • Исключения регистрируются в интерфейсе Resque.
  • Возможна ручная перепланировка через интерфейс Resque.
  • В сочетании с resque-loner вы предотвращаете двойное выполнение, если задание занимает больше времени, чем интервал между двумя выполнениями.
  • Все еще подчиняется приоритетной системе Resque.
  • Никакой дополнительной загрузки-time (может занять до 60 секунд, если ваше приложение становится больше), так как оно использует рабочий пул Resque.
  • Используется на единицу меньше.
  • Простой переключатель: настройка выполняется в cron-подобная манера.
0 голосов
/ 24 августа 2015

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

Вы можете использовать такой синтаксис, как этот:

every 3.hours do
    runner "MyModel.some_process"
    rake "my:rake:task"
    command "/usr/bin/my_great_command"
end

установить его, используя:

$ gem install whenever

или добавить его в свой GemFile:

gem 'whenever', :require => false

затем запустите:

$ cd /apps/my-great-project
$ wheneverize .

надеюсь, это поможет вам!

...