Java任务调度器:Quartz Scheduler — 完整指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Java任务调度器:Quartz Scheduler



在现代 Java 开发中,经常需要按计划执行特定操作:发送邮件推送、归档日志、同步数据或生成报告。为了解决这些任务,存在一个强大且灵活的库 Quartz Scheduler。这是一个开源框架,允许使用触发器(Triggers)和 cron 表达式创建、调度和管理任务(Jobs)。Quartz 可以轻松集成到 Spring Boot、Java EE 以及任何独立应用程序中。



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.cronSchedu

推荐