Мониторинг таблицы базы данных на предмет внешних изменений в приложении Rails - PullRequest
3 голосов
/ 01 апреля 2010

Я интегрирую некоторые таблицы не-rails-модели в мое приложение Rails. Все работает очень хорошо, способ, которым я настроил модель:

class Change < ActiveRecord::Base
  establish_connection(ActiveRecord::Base.configurations["otherdb_#{RAILS_ENV}"])
  set_table_name  "change"
end

Таким образом, я могу использовать модель Change для всех существующих записей с find и т. Д.

Теперь я хотел бы запустить какое-то уведомление, когда запись добавляется в таблицу. Поскольку модель никогда не создается с помощью Change.new и Change.save, использование ActiveRecord::Observer не вариант.

Можно ли каким-то образом заставить мой код Rails выполняться всякий раз, когда добавляется новая запись? Я посмотрел на delayed_job, но не могу понять, как это настроить. Я предполагаю, что он развивается вокруг задания cron, которое выбирает все строки, которые были созданы с момента последнего запуска задания, а затем вызывает соответствующий код Rails для каждой строки.

Обновление В настоящее время смотрит на Javan's Всякий раз, когда , похоже, что он может решить 'код запуска rails из части cron'.

Ответы [ 3 ]

1 голос
/ 14 апреля 2010

Это то, что я наконец-то сделал: используйте Всякий раз , потому что он прекрасно интегрируется с Capistrano и показал мне, как запускать код Rails из cron. Мой пропавший мир был в основном

script/runner -e production 'ChangeObserver.recentchanges'

, который теперь запускается каждые 5 минут. recentchanges читает последний просмотренный идентификатор из tmp-файла, извлекает все новые Change записи, которые имеют более высокий идентификатор, чем этот, и запускает обычный код наблюдателя для каждой записи (и сохраняет самый высокий просмотренный идентификатор в конечно, tmp-файл).

1 голос
/ 14 апреля 2010

Как обычно при мониторинге изменений состояния, существует два подхода: опрос и уведомление. Похоже, вы решили пока пойти по пути опроса (при выполнении задания cron регулярно просматривать состояние базы данных и выполнять некоторый код, если он изменился) Вы можете сделать то же самое, используя один из рельсовых планировщиков, есть несколько (Google легко их найдет, у них есть различные наборы функций, я позволю вам выбрать тот, который соответствует вашим потребностям, если у вас есть этот способ)

Вы также можете попробовать отправлять уведомления в зависимости от вашей базы данных. Некоторые базы данных поддерживают как триггеры, так и выполнение внешних процессов или специальные протоколы уведомлений. В этом случае сама база данных уведомляет вас об изменении таблицы. Есть много таких опций для различных СУБД в Получение событий из базы данных

1 голос
/ 02 апреля 2010

Да, вам понадобится какой-нибудь процессор фоновых задач (Delayed :: Job - один из самых популярных, или вы можете подделать свой собственный с библиотекой Daemon или аналогичным) или установить cronjob, который запускается на некоторых вроде графика. Если вы хотите часто проверять (скажем, каждую минуту), я бы порекомендовал маршрут Delayed :: Job, если он длиннее (каждый час или около того), то для задания cron все будет хорошо.

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

-jon

...