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

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

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

Начать курс

Планировщик задач Java: Quartz Scheduler — мощный инструмент для автоматизации

В современной разработке на Java часто возникает необходимость выполнять определённые действия по расписанию: отправка отчётов, очистка кэша, синхронизация данных или запуск фоновых процессов. Встроенный java.util.Timer и ScheduledExecutorService подходят для простых сценариев, но для сложных корпоративных систем требуется более гибкое и надёжное решение. Таким решением является Quartz Scheduler — мощная, открытая библиотека для планирования задач на Java.

Что такое Quartz Scheduler?

Quartz — это библиотека с открытым исходным кодом, которая позволяет создавать, планировать и выполнять задания (Jobs) с высокой точностью. Она поддерживает:

  • Гибкие триггеры на основе cron-выражений и простых интервалов.
  • Постоянное хранение задач в базах данных (JDBC).
  • Кластеризацию для отказоустойчивости.
  • Параллельное выполнение и управление потоками.
  • Прослушивание событий (Listeners) для мониторинга.

Quartz активно используется в Spring Framework (через модуль spring-boot-starter-quartz) и в enterprise-приложениях.

Установка и подключение

Для начала работы добавьте зависимость в 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'

Основные компоненты Quartz

Чтобы понять, как работает планировщик, разберём его ключевые элементы:

  • Job — интерфейс, который реализует ваша задача. Содержит метод execute(JobExecutionContext context).
  • JobDetail — описание задачи (имя, группа, данные).
  • Trigger — правило запуска (время, интервал, cron).
  • Scheduler — главный компонент, управляющий всеми задачами.

Пример: простой планировщик с cron-выражением

Создадим задачу, которая выводит сообщение каждые 10 секунд.

Шаг 1. Реализуем Job

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class SimpleJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("Задача выполнена! Время: " + System.currentTimeMillis());
    }
}

Шаг 2. Настраиваем Scheduler и запускаем

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

public class QuartzExample {
    public static void main(String[] args) throws SchedulerException {
        // 1. Создаём фабрику и получаем планировщик
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
        scheduler.start();

        // 2. Создаём JobDetail
        JobDetail job = JobBuilder.newJob(SimpleJob.class)
                .withIdentity("myJob", "group1")
                .build();

        // 3. Создаём Trigger с cron-выражением (каждые 10 секунд)
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("myTrigger", "group1")
                .withSchedule(CronScheduleBuilder.cronSchedule("0/10 * * * * ?"))
                .build();

        // 4. Планируем задачу
        scheduler.scheduleJob(job, trigger);

        // 5. Ждём 30 секунд для демонстрации
        try {
            Thread.sleep(30000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 6. Останавливаем планировщик
        scheduler.shutdown();
    }
}

Объяснение cron-выражения "0/10 * * * * ?":

  • 0/10 — секунды: каждые 10 секунд, начиная с 0.
  • * — минуты, часы, день месяца, месяц — любые.
  • ? — день недели (не указан).

Работа с данными в Job

Часто нужно передать в задачу параметры. Используйте JobDataMap:

JobDetail job = JobBuilder.newJob(SimpleJob.class)
        .usingJobData("username", "admin")
        .usingJobData("retryCount", 3)
        .build();

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