Приложение Rails должно выполнять задачу раз в месяц - PullRequest
1 голос
/ 15 декабря 2010

Я делаю приложение под названием книжный клуб.Много книг с голосами будет в системе.Каждый месяц первого числа месяца мне нужна система автоматического продвижения книги, набравшей наибольшее количество голосов, чтобы она стала «книгой месяца».Логика продвижения книги и обеспечения существования только одной книги месяца уже реализована.

book.promote!

Прекрасно, да?

У меня есть тестовый случай, спешащий

    Given the following books exist:
  | title               | author            | year_published | votes | created_at        |
  | Lord of the Flies   | William Golding   | 1954           | 18    | January 12, 2010  |
  | The Virgin Suicides | Jeffrey Eugenides | 1993           | 12    | February 15, 2010 |
  | Island              | Richard Laymon    | 1991           | 6     | November 22, 2009 |
And the book "Lord of the Flies" is the current book of the month
And the date is "February 24, 2010"
Then the book "Lord of the Flies" should be the current book of the month
When the date is "March 1, 2010"
And I am on the home page
Then I should see "This Month's Book of the Month Club Book"
And I should see "The Virgin Suicides"
And the book "The Virgin Suicides" should be the current book of the month
And the book "Lord of the Flies" should not be the current book of the month
And the book "Island" should not be the current book of the month

И я пытаюсь добиться этого.

Итак, вопрос в том, как лучше всего внедрить автоматическое обновление раз в месяц, которое можно протестировать по этому сценарию?

Крон слишком неряшливый, на мой вкус.Я хотел бы более портативное решение.

delayed_job / Resque кажется слишком тяжелым для ситуации.Также я немного не уверен, как заставить их запускать задания раз в месяц.

Просто ищу простое, но надежное и проверяемое решение.

Приветствия, как всегда!

Ответы [ 5 ]

2 голосов
/ 15 декабря 2010

Я использую delayed_job для этого типа требований.

class Book
  def promote
    # code for the promote method..

  ensure
    # re-run the task in another 30 days.
    promote
  end
  # Date.today.nextmonth.beginning_of_month will be evaluated 
  #when promote is called
  handle_asynchronously :promote, :run_at => Proc.new { 
    Date.today.next_month.beginning_of_month 
  }

end
1 голос
/ 15 декабря 2010

Хороший способ управления периодическими задачами - всегда, когда: https://github.com/javan/whenever

Я использую OS Cron, но весь конфиг живет в вашем приложении rails, поэтому работать с ним приятнее.

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

Может быть, приложение может просто «всегда» спрашивать себя, является ли это первым месяцем еще при загрузке просмотра рейтинга, и если это так, оно будет подсчитывать, используя только голоса в пределах соответствующего диапазона дат?

А чтобы проверить поведение, зависящее от времени, проверьте timecop: https://github.com/jtrupiano/timecop

0 голосов
/ 15 декабря 2010

delayed_job действительно хороший выбор.В настоящее время вы тестируете небольшое количество книг, поэтому вычисление promote выполняется довольно быстро.

Когда ваше приложение масштабируется, вы захотите выполнить этот расчет в отдельном рабочем процессе, чтобы уменьшить влияние на взаимодействие с пользователем.delayed_job убьет двух зайцев одним выстрелом: предоставьте механизм планирования и перенесите расчет promote на отдельный рабочий процесс.

0 голосов
/ 15 декабря 2010

Мы говорим здесь о 2 разных вещах:

  1. Задание, которое запускается и выполняет задачу для системы: это будет выполнено через rake, оно довольно надежно и хорошо протестировано.
  2. Планировщик, который запускает эту задачу по заданному вами расписанию. Кажется, вы ищете альтернативы cron. Вы можете попробовать launchd для этого.
0 голосов
/ 15 декабря 2010

Как Джон начал говорить Cron / всякий раз, когда путь сюда. Другие фоновые демоны требуют отдельного процесса, который будет простаивать большую часть времени. У вас не должно быть проблем с переносимостью cron, если вы не заинтересованы в работе в Windows.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...