Как определить частоту работы в приложении пользователями? - PullRequest
3 голосов
/ 10 августа 2011

У меня есть приложение, которое должно запускать задания повторно. Но (да, это было бы легко без но ...) Я хотел бы, чтобы пользователи определяли свою частоту резервного копирования в приложении.

В в худшем случае им придется выбирать между:

  • еженедельно,
  • ежедневно,
  • каждые 12 часов,
  • каждые 6 часов,
  • час

В в лучшем случае они должны иметь возможность использовать выражения crontab (см., Например, документацию )

Как это сделать? Должен ли я запускать задание каждую минуту, которое проверяет время последнего выполнения, частоту, а затем запускает другое задание, если это необходимо? Создаю ли я какую-то очередь, которая будет выполняться мастером?

Любые подсказки, идеи, мнения, лучшие практики, опыт приветствуются!

РЕДАКТИРОВАТЬ: Решил эту проблему с помощью планировщика Akka. Хорошо, это техническое решение, а не дизайнерский ответ, но все же все работает отлично.

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

Ответы [ 3 ]

1 голос
/ 17 августа 2011

Это может быть сделано двумя способами в зависимости от ваших требований / архитектуры:

Если вы можете использовать только Play:

  • Пользователь создает задание и его частоту.запустить (crontab, что угодно).
  • Сохраняя задание, вы рассчитываете время его первого запуска.Затем вы добавляете запись в таблицу JOBS с указанием времени выполнения, идентификатора задания и любой другой необходимой информации.Это необходимо, так как воспроизведение без сохранения состояния и информация должна храниться в БД для последующего извлечения.
  • У вас есть задание, которое запрашивает в таблице записи, дата выполнения которых меньше, чем сейчас.Получает первый, запускает его, удаляет из таблицы и добавляет новую запись для следующего выполнения.Вы должны сохранить некоторый счетчик выполнения, чтобы в случае сбоя задачи (что означает, что запись не удалена из БД), она не будет блокировать выполнение других задач заданием снова и снова.
  • Частота этогозадание запускается каждую секунду.Таким образом, пока в таблице есть информация, вы должны выполнять запрос так часто, как это требуется.Так как Play не создаст новую работу, в то время как текущая будет работать, если у вас будет достаточно задач, эта одна работа будет служить всем.В противном случае он будет убит в какой-то момент и восстановлен, когда потребуется.

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

Если вы можете использовать больше, чем Play:

Лучшая альтернативаЯ считаю, что нужно использовать Quartz (см. this ) для создания будущего выполнения, когда пользователь создает задание, и перепрограммировать его после завершения выполнения.

1 голос
/ 10 августа 2011

По этому поводу в google-группах шла дискуссия.Насколько я помню, вы должны определить работу, которая запускается каждые 6 часов и проверить, какие резервные копии должны быть сделаны.Таким образом, вы должны помнить, когда было завершено последнее задание резервного копирования, и самостоятельно выполнить контроль.Я не уверен, сможет ли Кварц справиться с таким требованием.

Я посмотрел в исходном коде (всегда хороший источник ;-)) и нашел метод каждый, где я думаю, что это должно быть то, что вы хотите.Как бы то ни было, я не уверен, что это умный дизайн, потому что если у вас 1000 пользователей, у вас будет 1000 рабочих мест.Я не уверен, что Play был создан для обработки такого большого количества заданий.

[Обновить] Для cron-выражений вы должны взглянуть на JobPlugin.scheduleForCRON()

0 голосов
/ 22 августа 2011

Есть несколько способов решить эту проблему.

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

Или, если вы все равно предпочитаете использовать синтаксис cron, просто напишите (экспортируйте) задания в пользовательский crontab, используя оболочку, которая вызывает ваше запущенное приложение, или запустите задание в автономном процессе, если это возможно.

...