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 模块)和企业级应用中被广泛使用。



安装与配置



首先,在 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. 创建带 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(); }}

推荐