У меня есть класс (/lib/updater.rb
), который делает большое обновление базы данных (вызов внешнего сервера, вычисления, ...). Обычно эта задача вызывается cron сервера (rake /lib/tasks/launch_updater.rake
, которые запускают updater.rb
), но я хотел бы дать возможность запустить его вручную и с клиента.Rails - запустить задачу рейка или новый поток от контроллера?
В этот момент от клиента, пользователь может нажать на кнопку и запустить его таким образом:
# the controller
Thread.new {
Updater.start
}
Это хорошее решение, или лучше запускать непосредственно из задачи грабли?
# something like this from the controller
Rake::Task[params[:task]].reenable
Rake::Task[params[:task]].invoke
Задача должна быть неблокирующей (пользователь должен нормально перемещаться по приложению, не дожидаясь окончания задачи).
Что лучше и почему?
Вы можете сделать это с помощью отсроченной жемчужину работы. Взгляните на это https://github.com/collectiveidea/delayed_job – Arun
+1 @Arun спасибо, хорошая альтернатива, но что вы думаете о моих 2 решениях? – damoiser
IMHO, Thread - не очень хорошая идея. Выполнение его в качестве фоновой работы лучше всего подходит для вашего требования. Вызов задачи рейка в контроллере - это плохая практика. – Arun