Временные серверные события с ruby ​​on rails

Я пытаюсь создать веб-игру на Ruby on Rails. У меня есть модель с именем «Игра», у которой есть дата и время в записи базы данных, которая соответствует времени, когда я хотел бы, чтобы сервер вызывал функцию update_game игровой модели. В зависимости от настроек игры, это может быть каждые 30 секунд или каждые 12 часов.

Ruby on Rails работает только тогда, когда получает HTTP-запрос; Есть ли способ заставить мою игру периодически обновляться независимо от HTTP-запросов?


person Ryan    schedule 25.12.2009    source источник


Ответы (4)


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

Хотя я бы провел много тестов;) - вы не хотите, чтобы работа ускользала от вас.

person dunedain289    schedule 11.02.2010

Сам Rails этого не делает; крон делает это. Тем не менее, в Ruby есть гем с именем Whenever, упрощающий объявление и развертывание новых заданий cron.

Однако, если вы действительно ожидаете, что большое количество игр будет надежно обновляться каждые 30 секунд, вы можете выбрать другой подход, если обновление игры займет значительное время. Возможно, после доступа к игре игра сможет запускать обновление столько раз, сколько необходимо (например, если прошло 3 минуты, а интервал составляет 30 секунд, запустите 6 обновлений после запроса). Однако это может быть или не быть хорошим вариантом для вашей установки, поэтому выясните, какой метод более подходит для ваших целей.

person Matchu    schedule 25.12.2009
comment
Сложность с обновлением при каждом доступе к игре заключается в том, что игра будет обновлять дочерние объекты и объекты-внуки. Мне пришлось бы поместить аналогичный код в каждый потомок игры, и кажется, что будет легко ввести ошибки, если я добавлю внука, но забуду поставить before_filter для обновления игры при доступе к ней. - person Ryan; 25.12.2009
comment
Так это более чем один контроллер? Тогда я полагаю, что cron определенно является лучшим решением. Всегда отличный инструмент :) - person Matchu; 25.12.2009
comment
Если вы беспокоитесь о том, что забыли before_filter, то почему бы вам не создать класс, наследуемый от ActionController, со всеми необходимыми настройками и методами, а затем наследовать от него все ваши контроллеры? - person Trevoke; 19.01.2010

Изучите параметры фоновой обработки и, возможно, cron.

person srboisvert    schedule 25.12.2009

Мне нравится гем «rufus-scheduler», который работает в Rails, хотя я не уверен, что вы можете программно добавить к нему больше задач.

person Trevoke    schedule 19.01.2010