Планировщик задач Java: Quartz Scheduler – полное руководство

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Планировщик задач 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                    

Рекомендаций