- 核心概念:
Job,JobDetail,Trigger,Scheduler - Cron 表达式详解:这是时间设置的核心
- Java 代码示例:如何创建一个带有特定时间设置的定时任务
- 常用 Cron 表达式示例
- 其他 Trigger 类型简介:除了 CronTrigger,还有哪些选择
核心概念
在设置时间之前,你需要了解 Quartz 的几个基本组件:

- Job (任务):这是一个接口,你需要实现它来定义你想要执行的具体业务逻辑,发送邮件、生成报表等。
- JobDetail (任务详情):它包含了 Job 的实例以及 Job 的一些配置信息(比如任务名、任务组),它不是 Job 类本身,而是 Job 的“计划表”。
- Trigger (触发器):它决定了 Job 何时以及如何执行,我们最常用的就是
CronTrigger,它通过 Cron 表达式来定义执行时间。 - Scheduler (调度器):这是 Quartz 的总指挥,它负责将 JobDetail 和 Trigger 关联起来,并按照 Trigger 的定义来执行 Job。
简单比喻:
- Job:你要做的具体事情(打扫卫生”)。
- JobDetail:为“打扫卫生”这件事准备的详细计划(打扫办公室,每周一次”)。
- Trigger:设定执行“打扫卫生”的具体时间点(每周五下午 5 点”)。
- Scheduler:负责监督和执行这个计划,确保每周五下午 5 点你真的去打扫卫生。
Cron 表达式详解
Cron 表达式是一个字符串,由 6-7 个时间字段组成,用来定义任务的执行时间,它的格式非常灵活但也很严格。
语法结构
秒 分 时 日 月 星期 年(可选)
| 字段 | 允许的值 | 特殊字符 |
|---|---|---|
| 秒 | 0-59 | , , , |
| 分 | 0-59 | , , , |
| 时 | 0-23 | , , , |
| 日 | 1-31 | , , , , L , W |
| 月 | 1-12 或 JAN-DEC | , , , |
| 星期 | 1-7 或 SUN-SAT | , , , , L , W |
| 年 | 1970-2099 | , , , |
特殊字符含义
- (星号):代表“所有值”,在“时”字段上使用 ,表示每小时都执行。
- (逗号):用于列出多个值,在“星期”字段上使用
MON,WED,FRI,表示周一、周三、周五执行。 - (连字符):用于定义一个范围,在“时”字段上使用
9-17,表示从上午 9 点到下午 5 点(包括 9 和 17 点)。 - (斜杠):用于定义“起始时间”和“间隔时间”,在“分”字段上使用
0/5,表示从第 0 分钟开始,每隔 5 分钟执行一次。*/10表示每隔 10 分钟执行一次。 L(Last):表示“,它在“日”和“星期”字段上有特殊含义。- 在“日”字段上:
L表示该月的最后一天(1月31日,2月28日或29日)。 - 在“星期”字段上:
L表示该周的最后一个星期六(或星期日,取决于你的日历设置)。6L或SATL都表示“最后一个周六”。
- 在“日”字段上:
W(Weekday):表示“工作日”,它只能用于“日”字段,表示离该日期最近的工作日(周一到周五)。15W表示如果 15 号是周六,则会在 14 号(周五)触发;15 号是周日,则会在 16 号(周一)触发,15 号本身就是工作日,则就在 15 号触发。- (井号):用于表示“第几个星期X”,它只能用于“星期”字段。
6#3表示“每月的第 3 个周六”。
Java 代码示例
下面是一个完整的 Java 示例,展示如何创建一个每分钟执行一次的定时任务。
步骤 1: 创建 Job 类
实现 org.quartz.Job 接口。

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class MyJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
// 这里写你的业务逻辑
System.out.println("Hello, Quartz! 任务执行时间: " + new java.util.Date());
}
}
步骤 2: 配置并启动 Scheduler
在主程序中,配置 Scheduler,创建 JobDetail 和 Trigger,并将它们关联起来。
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
public class QuartzSchedulerExample {
public static void main(String[] args) throws SchedulerException {
// 1. 创建一个 SchedulerFactory
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
// 2. 获取一个 Scheduler 实例
Scheduler scheduler = schedulerFactory.getScheduler();
// 3. 定义 JobDetail
// JobDetail 需要指定一个名称、一个组,以及关联的 Job 类
JobDetail jobDetail = JobBuilder.newJob(MyJob.class)
.withIdentity("myJob", "group1") // 任务名和任务组
.build();
// 4. 定义 Trigger (CronTrigger)
// 使用 CronTriggerBuilder 来创建 Trigger,并设置 Cron 表达式
// "0/10 * * * * ?" 表示每 10 秒执行一次
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("myTrigger", "group1") // 触发器名和触发器组
.startNow() // 立即启动
.withSchedule(CronScheduleBuilder.cronSchedule("0/10 * * * * ?")) // 设置 Cron 表达式
.build();
// 5. 将 JobDetail 和 Trigger 关联并调度
scheduler.scheduleJob(jobDetail, trigger);
// 6. 启动 Scheduler
scheduler.start();
System.out.println("Quartz 调度器已启动...");
// 为了让程序不退出,可以保持运行
try {
Thread.sleep(60000); // 运行60秒后关闭
} catch (InterruptedException e) {
e.printStackTrace();
}
// 关闭调度器
scheduler.shutdown();
System.out.println("Quartz 调度器已关闭。");
}
}
如何运行:
- 确保你的项目中已经添加了 Quartz 的依赖(Maven 或 Gradle)。
- 创建
MyJob.java和QuartzSchedulerExample.java文件。 - 运行
QuartzSchedulerExample的main方法。 - 你会看到控制台每 10 秒打印一次 "Hello, Quartz!"。
常用 Cron 表达式示例
| 需求 | Cron 表达式 | 说明 |
|---|---|---|
| 每秒执行 | 0/1 * * * * ? |
从第 0 秒开始,每 1 秒执行一次。 |
| 每 5 分钟执行 | 0 0/5 * * * ? |
每小时的 0, 5, 10, 15... 分钟执行。 |
| 每天凌晨 1 点执行 | 0 0 1 * * ? |
每天 1 点 0 分 0 秒执行。 |
| 每天中午 12 点执行 | 0 0 12 * * ? |
每天 12 点执行。 |
| 每天上午 10 点和下午 4 点执行 | 0 0 10,16 * * ? |
在 10 点和 16 点执行。 |

