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

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

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

Начать курс

Планировщик задач Java: Quartz Scheduler

В современной разработке на Java часто возникает необходимость выполнять определённые действия по расписанию: отправка email-рассылок, архивация логов, синхронизация данных или генерация отчётов. Для решения этих задач существует мощная и гибкая библиотека Quartz Scheduler. Это open-source фреймворк, который позволяет создавать, планировать и управлять задачами (Jobs) с использованием триггеров (Triggers) и cron-выражений. Quartz легко интегрируется с Spring Boot, Java EE и любыми standalone-приложениями.

Основные возможности Quartz

  • Гибкое планирование — поддержка простых интервалов (каждые N секунд/минут) и сложных cron-выражений.
  • Персистентность — хранение состояния задач в базе данных (JDBC JobStore) для восстановления после перезапуска приложения.
  • Кластеризация — распределение задач между несколькими узлами для отказоустойчивости.
  • Параллельное выполнение — возможность запускать несколько задач одновременно.
  • Пропущенные запуски — настройка поведения при простое (misfire instructions).

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

Для использования Quartz добавьте зависимость в 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() пишется бизнес-логика.

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

public class HelloJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("Привет! Задача выполнена в " + new java.util.Date());
    }
}

Настройка планировщика и триггера

Планировщик (Scheduler) создаётся через фабрику StdSchedulerFactory. Затем создаётся триггер — простой (SimpleTrigger) или на основе cron (CronTrigger).

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

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

        // 2. Определяем задачу
        JobDetail job = JobBuilder.newJob(HelloJob.class)
                .withIdentity("myJob", "group1")
                .build();

        // 3. Создаём триггер — запуск каждые 10 секунд
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("myTrigger", "group1")
                .startNow()
                .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                        .withIntervalInSeconds(10)
                        .repeatForever())
                .build();

        // 4. Привязываем задачу к триггеру и запускаем планировщик
        scheduler.scheduleJob(job, trigger);
        scheduler.start();
    }
}

Использование cron-выражений

Cron-выражения позволяют задавать сложные расписания. Формат: секунды минуты часы день-месяца месяц день-недели.

// Запуск каждый день в 18:30
CronScheduleBuilder cronSchedule = CronScheduleBuilder
        .dailyAtHourAndMinute(18, 30);

// Или вручную: "0 30 18 * * ?" (каждый день в 18:30)
Trigger cronTrigger = TriggerBuilder.newTrigger()
        .withIdentity("cronTrigger", "group1")
        .withSchedule(CronScheduleBuilder.cronSchedule("0 30 18 * * ?"))
        .build();

Примеры cron-выражений:

  • "0 0 12 * * ?" — каждый день в 12:00
  • "0 0/5 * * * ?" — каждые 5 минут
  • "0 0 9-17 * * MON-FRI" — каждый час с 9 до 17 по будням
  • "0 0 0 1 * ?" — каждый первый день месяца в полночь

Передача данных в задачу

Через JobDataMap можно передавать параметры:

JobDetail job = JobBuilder.newJob(EmailJob.class)
        .usingJobData("email", "user@example.com")
        .                    

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