Quartz定时任务调度框架
一、引言
Quartz是一个功能强大的定时任务调度框架,适用于需要在特定时间执行任务的场景。例如:
- 30分钟后检查订单支付状态,若未支付则取消订单
- 每月29日自动执行信用卡还款
Quartz的作用是根据预设的触发时间规则,自动执行相应的任务(Job)。通过简单的配置即可实现复杂的时间调度逻辑。
二、使用Quartz
2.1 添加依赖
在项目中添加Quartz依赖:
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>
2.2 定义任务
创建一个简单的任务类:
package com.example.task;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.util.Date;
public class MyTask implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
JobDetail jobDetail = jobExecutionContext.getJobDetail();
JobKey key = jobDetail.getKey();
String taskName = key.getName();
String taskGroup = key.getGroup();
System.out.println("任务开始执行,任务名:" + taskName + ",分组:" + taskGroup + ",时间:" + new Date());
}
}
2.3 创建调度程序
使用主程序测试任务调度:
package com.example.task;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
public class QuartzTest {
public static void main(String[] args) throws SchedulerException {
// 创建调度器
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
// 创建触发器
SimpleTrigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "group1")
.startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(5) // 每5秒执行一次
.repeatForever())
.build();
// 创建任务详情
JobDetail jobDetail = JobBuilder.newJob(MyTask.class)
.withIdentity("job1", "group1")
.build();
// 注册任务和触发器
scheduler.scheduleJob(jobDetail, trigger);
// 启动调度器
scheduler.start();
}
}
2.4 配置Quartz
创建配置文件quartz.properties,放在classpath目录下:
# 指定调度器实例名称
org.quartz.scheduler.instanceName = MyScheduler
# 指定线程池实现类
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
# 设置线程池大小
org.quartz.threadPool.threadCount = 10
# 设置线程优先级
org.quartz.threadPool.threadPriority = 5
# 使用内存存储任务(非持久化)
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
三、核心组件
Quartz的主要组件包括:
- 调度器(Scheduler):负责任务的调度和执行,是Quartz的核心管理单元。
- 任务(Job):需要定时执行的具体逻辑代码。
- 任务详情(JobDetail):对任务进行封装,包括任务名称、分组等信息。
- 触发器(Trigger):定义任务的执行时间规则。
四、触发器(Trigger)
4.1 SimpleTrigger
SimpleTrigger适用于基于固定时间间隔的任务调度:
SimpleTrigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "group1")
.startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInMinutes(1) // 每分钟执行一次
.repeatForever())
.build();
4.2 CronTrigger
CronTrigger支持基于Cron表达式的复杂调度规则:
CronTrigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "group1")
.withSchedule(CronScheduleBuilder.cronSchedule("0 15 10 * * ?")) // 每天10:15执行
.build();
4.3 Cron表达式解析
Cron表达式格式为:秒 分 时 日 月 星期
支持的特殊符号包括:
- *:表示所有可能的值
- ?:表示不指定值
- -:表示范围
- ,:表示多个值
- /:表示间隔
- L:表示最后一天
五、Spring与Quartz整合
5.1 添加依赖
在Spring项目中添加以下依赖:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.3.6</version>
</dependency>
5.2 配置调度器
在Spring配置文件中定义任务和触发器:
<bean name="myTask" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="name" value="my_task"/>
<property name="group" value="task_group"/>
<property name="jobClass" value="com.example.task.MyTask"/>
</bean>
<bean id="myTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="name" value="my_trigger"/>
<property name="group" value="trigger_group"/>
<property name="jobDetail" ref="myTask"/>
<property name="cronExpression" value="*/5 * * * * ?"/>
</bean>
<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="myTrigger"/>
</list>
</property>
</bean>
5.3 启动调度器
在主程序中启动Spring上下文以启动调度器:
public static void main(String[] args) throws InterruptedException {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
}