一、Quartz引言
Quartz是一个定时任务调度框架,比如你遇到这样的问题:
- 比如淘宝的待支付功能,后台会在你生成订单后24小时后,查看订单是否支付,未支付则取消订单
- 比如vip的每月自动续费功能
- …
- 想定时在某个时间,去做某件事
Quartz是一套轻量级的任务调度框架,只需要定义了 Job(任务),Trigger(触发器)和 Scheduler(调度器),即可实现一个定时调度能力。支持基于数据库的集群模式,可以做到任务幂等执行。
二、Quartz使用
2.1 导入依赖
<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.3</version>
</dependency>
2.2 定义Job
-
定义一个HelloJob类实现Job类
package com.lyx.job;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;import java.util.Date;
public class HelloJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println(“hello job exec”+new Date());
}
}
2.3 API测试
-
写个主函数,在主函数里面完成整个Quartz的API的操作过程
package com.lyx.job;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import java.util.GregorianCalendar;public class HelloQuartz {
public static void main(String[] args) throws SchedulerException {
//1. 调度器
Scheduler defaultScheduler = StdSchedulerFactory.getDefaultScheduler();
//2. trigger触发器
SimpleTrigger trigger = TriggerBuilder.newTrigger().withIdentity(“trigger1”,“group1”)
.startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(3).repeatForever())
.endAt(new GregorianCalendar(2022,5,11,16,05,30).getTime())
.build();
//3. JobDetail
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity(“job1”,“group1”).build();
//4. 将JobDetail和trigger增加到调度器
defaultScheduler.scheduleJob(jobDetail,trigger);
//5. 启动调度器
defaultScheduler.start();
}
}
2.3.1 细节
-
任务是有标识的,可以在HelloJob中获取
-
在上面定义的HelloJob.java中添加代码如下
import org.quartz.*;
import java.util.Date;public class HelloJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
JobDetail jobDetail = jobExecutionContext.getJobDetail();
JobKey key = jobDetail.getKey();
System.out.println(key.getName());
System.out.println(key.getGroup());
System.out.println(“hello job exec”+new Date());
}
}
2.4 配置
#指定调度器名称,非实现类
org.quartz.scheduler.instanceName=DefaultQuartzScheduler
#指定线程池实现类
org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
#线程池线程数量
org.quartz.threadPool.threadCount = 10
#优先级,默认5
org.quartz.threadPool.threadPriority = 5
#非持久化job
org.quartz.jobStore.class=org.quartz.simpl.RAMJobStore
2.5 核心类说明
Scheduler:调度器。所有的调度都是由它控制,是Quartz的大脑,所有任务都是由它来管理
Job:任务ÿ