Quartz
Зачем
Реализация паттерна Job, Background Job.
Основные понятия:
- SchedulerFactory — интерфейс фабрики для создания Scheduler.
- Scheduler — основной класс библиотеки, через который происходит управление планировщиком задач.
- Job — интерфейс для создания задач с запланированным выполнением
- JobDetail — интерфейс для создание инстансов Job.
- Trigger — интерфейс для определения расписания выполнения задач
- JobBuilder и TriggerBuilder — вспомогательные классы для создания инстансов JobDetail и Trigger.
Плюсы и минусы
Плюсы:
- Встроенная поддержка многоинстансного режима значительно облегчает горизонтальное масштабирование приложений
- Есть возможность сохранять нужные для работы данные между запусками джобы
- Возможность динамического создания джоб
- 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
- В настоящее время пользователям придется вписывать эту логику в свою реализацию задания, чтобы пропустить работу, если имена хостов совпадают с некоторым известным списком (VetoJobExecution).
Job Store
- RDBMS БД (MSSQL, PGSQL)
- NOSQL (через плагины)
- MongoDB
- Redis - не поддерживается кластерный режим Redis
Версии
- 2.0