一、Quartz
是啥来着!
很多太专业的话语我就先不说了!为什么!因为说得太专业,连我自己都蒙蔽了!太专业的话语也需要从网上copy过来,何必呢!我就以我自己的理解,尽量把我会的所有通俗易懂地记录下来。说到这个框架,反正它就是用来执行定时任务的,什么定时任务呢?比如说:
你想每天中午12:00去食堂吃饭
上面这句话可以拆解为三个部分:
- 1、每天中午12:00
(Trigger)
- 2、吃饭
(Job)
- 3、你的大脑使你这么做
(Scheduler)
上面的三点分别说明了Quartz
框架中最关键的三个组件,分别是触发器
,定时任务
,调度者
。非常容易理解,触发器就是告诉你什么时候定时任务该执行了!而调度者就是用来从宏观方面协调每个定时任务的执行的!
Quartz
在很多地方采用了建造者设计模式,像Trigger
有对应的TriggerBuilder
,JobDetail
有对应的JobBuilder
。知道了使用了建造者模式,那么我们就可以这样来创建对象:
JobDetail job = JobBuilder.newJob(yourJobClass).withIdentity(jobName, jobGroupName).build();
复制代码
在Quartz
中,每个任务有自己对应的任务名称和所属的组名称,每个任务的名称和所属组名称都是唯一的,如果指定不唯一,则报错!
在Quartz
中创建(Scheduler)
则用到了工厂方法设计模式,可见一般框架中设计模式的应用是非常普遍的!
Quartz
中默认在类路径下使用quartz.properties
作为配置文件,当然你也可以在你的类路径下创建一个同样的名称来进行覆盖,比如我在Spring boot工程的resource
目录下创建一个同名的文件来进行覆盖,如下图:
文件的属性配置可以参考官网的文档,说得非常地详细!
Quartz
的触发器Trigger
时间支持Date
类型和cron
表达式,Spring中自带的定时任务也提供了相应的cron表达式,对于什么是cron
表达式,小编后期再写一篇进行总结!
二、Spring boot 整合 Quartz
下面说说Quartz
在Spring boot应用中的使用,这可能会和网上很多的教程不同。
1、首先,我们一般要求全局只配置一个Scheduler
对象实例,而且我们想在启动Spring boot
的同时去调用这个Scheduler
对象实例的start()
方法,所以后期我们只需要动态将任务丢进这个实例中,或者从这个实例中移除任务即可。具体实现如下: 在工程中某个地方创建一个类StartSchedualer
:
@Component//这样会被Spring boot扫描到
public class StartSchedualer implements CommandLineRunner {//实现该接口
@Override
public void run(String... args) throws Exception {
try {
GetSchedual.getSchedual().start();//获取实例并启动
} catch (SchedulerException e) {}
}
}
复制代码
怎么动态加入任务呢?
@RequestMapping("/add")
public static void addJob() throws SchedulerException {
JobDetail job = JobBuilder.newJob(SimpleJob.class).withIdentity("job1", "group1").setJobData(null).build();
CronTrigger trigger = newTrigger().withIdentity("trigger1", "group1")
.withSchedule(cronSchedule("0/2 * * * * ?")).build();//每2秒执行一次任务
Date ft = GetSchedual.getSchedual().scheduleJob(job, trigger);//向Scheduler中注册任务
}
复制代码
怎么删除任务呢?
@RequestMapping("/remove")
//传入你需要
public void remove(@RequestParam String triggerName, @RequestParam String triggerGroupName,
@RequestParam String jobName, @RequestParam String jobGroupName) {
try {
Scheduler sched = GetSchedual.getSchedual();//还是获取那个唯一的对象(单例的嘛!)
TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);
//下面三个组件都需删除
sched.pauseTrigger(triggerKey);// 停止触发器
sched.unscheduleJob(triggerKey);// 移除触发器
sched.deleteJob(JobKey.jobKey(jobName, jobGroupName));// 删除任务
} catch (Exception e) {
throw new RuntimeException(e);
}
}
复制代码
GetSchedual.java
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
public class GetSchedual {
private static SchedulerFactory factory = new StdSchedulerFactory();
public static Scheduler getSchedual() throws SchedulerException {
Scheduler schedual = factory.getScheduler();
return schedual;
}
}
复制代码
pom.xml
<!-- quartz相关 -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
复制代码
最后,Quartz
也支持集群,详情可以阅读官网的文档,栗子呢可以下载官网源码包,在源码包的Example
中有提供!虽然它的源码阅读起来不难,但小编还得深入学习!
以上是我将Quartz
与Spring boot整合的栗子,可能弄得不好!有问题欢迎指出,一起交流,一起进步!