Планировщик задач Java: Quartz Scheduler
В современной разработке на Java часто возникает необходимость выполнять код по расписанию: отправка email-рассылок, очистка кэша, генерация отчётов или синхронизация данных. Для этих целей существует мощная библиотека Quartz Scheduler — де-факто стандарт для планирования задач в экосистеме Java.
Quartz Scheduler — это open-source фреймворк, который позволяет создавать, планировать и управлять задачами (Jobs) с помощью гибкой системы триггеров. Он поддерживает как простые задержки, так и сложные cron-расписания, устойчив к сбоям и может быть интегрирован с Spring Boot, Jakarta EE и другими платформами.
Основные возможности
- Гибкое планирование — поддержка простых триггеров (SimpleTrigger) с задержкой и повторением, а также cron-триггеров (CronTrigger) для сложных расписаний.
- Персистентность — задачи и триггеры могут храниться в БД (JDBC JobStore), что гарантирует выполнение даже после перезапуска приложения.
- Кластеризация — возможность запуска нескольких экземпляров планировщика с координацией через базу данных.
- Listeners — прослушивание событий выполнения задач (JobListener, TriggerListener) для логирования или дополнительной обработки.
- Мониторинг — встроенный API для просмотра текущих задач, их статуса и истории выполнения.
Установка и подключение
Для начала работы добавьте зависимость в ваш pom.xml (Maven):
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>
Для Gradle:
implementation 'org.quartz-scheduler:quartz:2.3.2'
Пример создания простой задачи
Создадим класс, реализующий интерфейс Job. Это и есть наша задача:
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.time.LocalTime;
public class SimpleJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("Задача выполнена в: " + LocalTime.now());
// Здесь ваш бизнес-код
}
}
Планирование задачи с помощью SimpleTrigger
Запустим задачу через 5 секунд и будем повторять каждые 10 секунд:
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
public class SimpleSchedulerExample {
public static void main(String[] args) throws SchedulerException {
// 1. Создаём планировщик
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
// 2. Определяем задачу (JobDetail)
JobDetail job = JobBuilder.newJob(SimpleJob.class)
.withIdentity("myJob", "group1")
.build();
// 3. Создаём триггер: старт через 5 секунд, повтор каждые 10 секунд
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("myTrigger", "group1")
.startAt(DateBuilder.futureDate(5, DateBuilder.IntervalUnit.SECOND))
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(10)
.repeatForever())
.build();
// 4. Назначаем задачу триггеру и запускаем
scheduler.scheduleJob(job, trigger);
scheduler.start();
}
}
Использование CronTrigger для сложных расписаний
Cron-выражения позволяют задать расписание любой сложности. Например, каждый день в 9:30 утра:
Trigger cronTrigger = TriggerBuilder.newTrigger()
.withIdentity("cronTrigger", "group1")
.withSchedule(CronScheduleBuilder.cronSchedule("0 30 9 ? * * *"))
.build();
Выражение "0 30 9 ? * * *" означает: "каждый день в 09:30:00". Расшифровка частей:
0— секунды30— минуты9— часы?— день месяца (не указан)*— месяц (любой)*— день недели (любой)*— год (необязательно)
Передача параметров в задачу
Часто нужно передать в задачу дополнительные данные. Используйте JobDataMap:
// При создании задачи
JobDetail job = JobBuilder.newJob