Anton Sidorov homepage

Bookmark this to keep an eye on my project updates!

Follow me on GitHub

Quartz

Зачем

Реализация паттерна Job, Background Job.

Основные понятия:

  • SchedulerFactory — интерфейс фабрики для создания Scheduler.
  • Scheduler — основной класс библиотеки, через который происходит управление планировщиком задач.
  • Job — интерфейс для создания задач с запланированным выполнением
  • JobDetail — интерфейс для создание инстансов Job.
  • Trigger — интерфейс для определения расписания выполнения задач
  • JobBuilder и TriggerBuilder — вспомогательные классы для создания инстансов JobDetail и Trigger.

alt text

Плюсы и минусы

Плюсы:

  • Встроенная поддержка многоинстансного режима значительно облегчает горизонтальное масштабирование приложений
  • Есть возможность сохранять нужные для работы данные между запусками джобы
  • Возможность динамического создания джоб
  • Quartz позволяет привязывать одну и ту же джобу к разным триггерам: можно создавать комплексное расписание работы джобы

Минусы:

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

Паттерны

  • DisallowConcurrentExecution - позволяет гарантировать, что в любой момент времени будет запущено не более одного экземпляра джобы (singleton)
    • Важно понимать, что аннотация относится только к джобам, запускающимся на одном инстансе приложения.
    • При работе в кластерном режиме Quartz сам контролирует срабатывание триггеров и, с помощью блокировок в БД, осуществляет запуск джобы только на одном из инстансов приложения.

Кластерный режим

  • При работе в кластерном режиме Quartz сам контролирует срабатывание триггеров и, с помощью блокировок в БД, осуществляет запуск джобы только на одном из инстансов приложения.
  • high availability and scalability to your scheduler via
    • fail-over
    • load balancing functionality
  • Configuring the Instance ID - By default, the scheduler is configured with a simple instance ID generator using the machine hostname and the current timestamp, so you don’t need to worry about setting a appropriate instance-id for each node when running in clustered mode.

Запуск задания на конкретном инстансе приложения

  • Отключить кластерный режим. Конфиг только на одном инстансе приложения и размещать задания в отдельных автономных планировщиках.
  • Указать на каком инстансе запускать задание (Job)
    • В настоящее время пользователям придется вписывать эту логику в свою реализацию задания, чтобы пропустить работу, если имена хостов совпадают с некоторым известным списком (VetoJobExecution).
      • you can use proper group name for triggers & jobs based on machine name in cluster (for identification) and see if the group name of triggers correspond to machine name it is firing on (attach a trigger listener and make corresponding checks in VetoJobExecution and return false if the job should not be run in that machine, else return true).
    • вариант реализации на группах заданий Java

Job Store

Варианты

  • RDBMS БД (MSSQL, PGSQL)
  • NOSQL (через плагины)
    • MongoDB
    • Redis - не поддерживается кластерный режим Redis

Версии

  • 2.0