Повторяющиеся задачи в приложении Ruby on Rails: Крон или другой?

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

Я писал сценарий оболочки, который будет взаимодействовать с базой данных и периодически начинает через крон - но это - большое двойное усилие, таким образом, я задавался вопросом, каковы будут "направляющие Путь" или "Ruby Путь", чтобы сделать это. Я использую Ubuntu, Apache и Пассажира. Можно ли предложить лучшие методы, которые, возможно, даже включены в приложение, таким образом, я могу легко развернуть приложение на другой машине, не имея необходимость смешиваться с кроном?

16
задан JJJ 3 June 2012 в 15:44
поделиться

5 ответов

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

Статические методы не должны содержать «состояния». Все, что связано с состоянием, должно быть связано с созданным объектом, а не с классом.

-121--936363-

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

Проверьте, http://railscasts.com/episodes/164-cron-in-ruby , для получения дополнительной информации о драгоценном камне whenver.

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

19
ответ дан 30 November 2019 в 21:19
поделиться

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

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

Создайте новый файл, lib / tasks / admin.rake

Внутри, создайте саму задачу:

namespace :admin
  desc "Updates all RSS feeds"
  task :rss => :environment do
    RssFeed.update_all
  end
end

Это предполагает, что у вас есть класс RSSFEED, а метод update_all делает то, что вы ожидаете. Вы можете назвать это из командной строки:

rake admin:rss

, и вы можете добавить это в CRON (позвонив Crontab -L как веб-пользователь) и добавление этой строки:

10 0 * * * cd /path/to/rails/app && rake RAILS_ENV=production admin:rss
6
ответ дан 30 November 2019 в 21:19
поделиться

Существуют различные решения. Для простейшей установки вы можете использовать скрипт/раннер в кронтабе что-то вроде:

10 0 * * * /home/myuser/myproject/script/runner -e production ModelName.methodname

Имя метода должно быть статическим методом на вашей модели. Вы должны ссылаться на проект по полному пути, иначе он, скорее всего, не будет найден в окружении cron. Проверьте вашу man-страницу crontab для получения информации о синтаксисе crontab, если вы не знакомы с ним. Вышеуказанное, например, запускает скрипт на 10-й минуте 0-го часа каждого дня (короче говоря, в 12:10 утра).

Если вам нужно более мощное решение, вы можете использовать BackgroundRB. BackgroundRB запускает демона и поддерживает задачи, которые планируют, и может помещать результаты в базу данных. У них даже есть простой протокол связи, позволяющий вашим веб-процессам запрашивать выполнение задачи, а затем иметь возможность получить результат. Это позволяет вам контролировать фоновые задания прямо из веб-интерфейса, а не из кронтаба, который просто "случается".

Для работы BackroundRB требуется немного больше настроек, но, возможно, это того стоит, если заданиями нужно управлять.

1
ответ дан 30 November 2019 в 21:19
поделиться

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

На моей последней работе команда OPS должна была видеть, как Cron мы устанавливаем, чтобы они могли быть уверены, что у него не будет никаких побочных эффектов для системы. Так что решение DSL не собирается работать. Но мы (разработчики) хотели, чтобы скрипты CRON в управлении версиями.

Так что для компромисса мы проверили текстовые файлы с RAW CRON, аналогичны этому:

10 0 * * * cd /path/to/rails/app && rake RAILS_ENV=production admin:rss

, и мы добавили шаг к сценарию CaPistrano, который установил это в Crontab в рамках части развертывания.

0
ответ дан 30 November 2019 в 21:19
поделиться

Попробуйте использовать всякий раз, когда . EventHouge в конце его создаст CRON, но определение планирования будет записано в вашем приложении с использованием RUBY DSL.

1
ответ дан 30 November 2019 в 21:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: