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