一、Quartz概述
Quartz是用来做定时任务调度的JavaEE框架
需求场景:
1、在每个月末,自动网易云会员续费,或者百度云盘会员续费
2、在迅雷下载完一个超过10G的资源的30秒之后自动关机
也就是说我们希望在某一个特定的时刻,去执行一些事情
二、快速入门
POM坐标:
<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz --> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version> </dependency>
打开右侧的Maven菜单工具,可以看到Quartz的依赖项,包含了两个数据源
编写一个类并且实现Job接口,重写接口的execute方法
package cn.dzz.quartz; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; /** * @author Echo42 * @file Quartz * @create 2020年09月12日16:53 * @description */ public class HelloQuartz implements Job { public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { // 我们希望执行的逻辑 System.out.println("Hello Quartz !!!"); } }
编写可运行的方法【Main或者JunitTest】
package cn.dzz; import cn.dzz.quartz.HelloQuartz; import org.junit.Test; import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; import java.util.GregorianCalendar; /** * @author Echo42 * @file Quartz * @create 2020年09月12日16:56 * @description */ public class QuartzTest { @Test public void testQuartzSample() throws SchedulerException { // 1、调度器对象 Scheduler defaultScheduler = StdSchedulerFactory.getDefaultScheduler(); // 2、触发器对象 ,指定执行事件如何触发 SimpleTrigger simpleTrigger = TriggerBuilder. newTrigger(). // 创建新的触发器 withIdentity("trigger01", "group01"). // 触发器实例的标识信息 startNow(). // 从什么时候开始触发执行 withSchedule( // 如何调度执行的规则 SimpleScheduleBuilder. simpleSchedule(). withIntervalInSeconds(10). repeatForever() ). endAt( // 从什么时候结束执行 new GregorianCalendar(2020, 10, 2, 14, 26, 33). getTime() ). build(); // 3、职责详细 JobDetail JobDetail jobDetail = JobBuilder.newJob(HelloQuartz.class).withIdentity("trigger01", "group01").build(); // 4、把职责详细对象和触发器对象注入到调度器对象中 defaultScheduler.scheduleJob(jobDetail, simpleTrigger); // 5、启动调度器 defaultScheduler.start(); } }
单元测试的结果,没反应?直接结束了
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. Process finished with exit code 0
换成main执行:
这才有效了。。。。
执行的上下文参数:
package cn.dzz.quartz; import org.quartz.*; /** * @author Echo42 * @file Quartz * @create 2020年09月12日16:53 * @description */ public class HelloQuartz implements Job { public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { // 我们希望执行的逻辑 System.out.println("Hello Quartz !!!"); // 除此之外,还可以获取调用此Job类的标识 JobDetail jobDetail = jobExecutionContext.getJobDetail(); JobKey jobDetailKey = jobDetail.getKey(); String name = jobDetailKey.getName(); // trigger01 String group = jobDetailKey.getGroup(); // group01 } }
Quartz的外部配置文件:
# quartz.properties 不可以更改配置文件名称,默认位置classpath目录下面。 # 如果没有此配置文件,Quartz会按照默认配置执行 # 指定调度器名称,非实现类? 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
核心类:
1、Scheduler 调度器,控制所有调度,Quartz的核心API,管理了所有任务
2、Job 任务,即我们希望Quartz管理的业务逻辑定义
3、JobDetail 任务详细,对Job对象的进一步封装,指定更详细的属性
4、Trigger 触发器,绑定任务,规定任务执行的触发规则
三、两种触发器:
SimpleTrigger & CronTrigger
1、SimpleTrigger 以一定时间范围内执行的任务,指定起始时间和截止时间,指定时间间隔与次数
// 2、触发器对象 ,指定执行事件如何触发 SimpleTrigger simpleTrigger = TriggerBuilder. newTrigger(). // 创建新的触发器 withIdentity("trigger01", "group01"). // 触发器实例的标识信息 startNow(). // 从什么时候开始触发执行 withSchedule( // 如何调度执行的规则 SimpleScheduleBuilder. simpleSchedule(). // withIntervalInSeconds(10). repeatForever() ). endAt( // 从什么时候结束执行 new GregorianCalendar(2020, 10, 2, 14, 26, 33). getTime() ). build();