简单说说Java定时任务框架---Quartz
⼀、Quartz是啥来着!
很多太专业的话语我就先不说了!为什么!因为说得太专业,连我⾃⼰都蒙蔽了!太专业的话语也需要从⽹上copy过来,何必呢!我就以我⾃⼰的理解,尽量把我会的所有通俗易懂地记录下来。说到这个框架,反正它就是⽤来执⾏定时任务的,什么定时任务呢?⽐如说:
你想每天中午12:00去⾷堂吃饭
上⾯这句话可以拆解为三个部分:
1、每天中午12:00(Trigger)
2、吃饭(Job)
3、你的⼤脑使你这么做(Scheduler)
上⾯的三点分别说明了Quartz框架中最关键的三个组件,分别是触发器,定时任务,调度者。⾮常容易理解,触发器就是告诉你什么时候定时任务该执⾏了!⽽调度者就是⽤来从宏观⽅⾯协调每个定时任务的执⾏的!
Quartz在很多地⽅采⽤了建造者设计模式,像Trigger有对应的TriggerBuilder,JobDetail有对应的JobBuilder。知道了使⽤了建造者模式,那么我们就可以这样来创建对象:
JobDetail job = wJob(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 args) throws Exception {
try {
} catch (SchedulerException e) {}
}
}
复制代码
怎么动态加⼊任务呢?
@RequestMapping("/add")
public static void addJob() throws SchedulerException {
JobDetail job = wJob(SimpleJob.class).withIdentity("job1", "group1").setJobData(null).build();  CronTrigger trigger = newTrigger().withIdentity("trigger1", "group1")
.withSchedule(cronSchedule("0/2 * * * * ?")).build();//每2秒执⾏⼀次任务
Date ft = Schedual().scheduleJob(job, trigger);//向Scheduler中注册任务
}
复制代码
怎么删除任务呢?
@RequestMapping("/remove")
//传⼊你需要
public void remove(@RequestParam String triggerName, @RequestParam String triggerGroupName,
@RequestParam String jobName, @RequestParam String jobGroupName) {
try {
Scheduler sched = Schedual();//还是获取那个唯⼀的对象(单例的嘛!)
TriggerKey triggerKey = iggerKey(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 = Scheduler();
return schedual;
}
}
复制代码springboot是啥
<!-- quartz相关 -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
复制代码
最后,Quartz也⽀持集,详情可以阅读官⽹的⽂档,栗⼦呢可以下载官⽹源码包,在源码包的Example中有提供!虽然它的源码阅读起来不难,但⼩编还得深⼊学习!
以上是我将Quartz与Spring boot整合的栗⼦,可能弄得不好!有问题欢迎指出,⼀起交流,⼀起进步!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。