Планировщик задач 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")
. Также в библиотеке
Планировщик задач на Go (Golang): гайд по реализации cron-задач
ImageSharp для C# (.NET): полное руководство с примерами
league/csv для PHP: полное руководство с примерами
Тестирование в Go (Golang): фреймворки и инструменты — полное руководство