简单说说Java 定时任务框架---Quartz

1、Quartz是啥来着!

不少太专业的话语我就先不说了!为何!由于说得太专业,连我本身都蒙蔽了!太专业的话语也须要从网上copy过来,何须呢!我就以我本身的理解,尽可能把我会的全部通俗易懂地记录下来。说到这个框架,反正它就是用来执行定时任务的,什么定时任务呢?好比说:java

你想天天中午12:00去食堂吃饭设计模式

上面这句话能够拆解为三个部分:bash

  • 一、天天中午12:00(Trigger)
  • 二、吃饭(Job)
  • 三、你的大脑使你这么作(Scheduler)

上面的三点分别说明了Quartz框架中最关键的三个组件,分别是触发器定时任务调度者。很是容易理解,触发器就是告诉你何时定时任务该执行了!而调度者就是用来从宏观方面协调每一个定时任务的执行的!app

Quartz在不少地方采用了建造者设计模式,像Trigger有对应的TriggerBuilder,JobDetail有对应的JobBuilder。知道了使用了建造者模式,那么咱们就能够这样来建立对象:框架

JobDetail job = JobBuilder.newJob(yourJobClass).withIdentity(jobName, jobGroupName).build();
复制代码

Quartz中,每一个任务有本身对应的任务名称和所属的组名称,每一个任务的名称和所属组名称都是惟一的,若是指定不惟一,则报错!ide

Quartz中建立(Scheduler)则用到了工厂方法设计模式,可见通常框架中设计模式的应用是很是广泛的!学习

Quartz中默认在类路径下使用quartz.properties做为配置文件,固然你也能够在你的类路径下建立一个一样的名称来进行覆盖,好比我在Spring boot工程的resource目录下建立一个同名的文件来进行覆盖,以下图:ui

文件的属性配置能够参考官网的文档,说得很是地详细!点击 quartz配置详解spa

Quartz的触发器Trigger时间支持Date类型和cron表达式,Spring中自带的定时任务也提供了相应的cron表达式,对于什么是cron表达式,小编后期再写一篇进行总结!设计

2、Spring boot 整合 Quartz

下面说说Quartz在Spring boot应用中的使用,这可能会和网上不少的教程不一样。

一、首先,咱们通常要求全局只配置一个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整合的栗子,可能弄得很差!有问题欢迎指出,一块儿交流,一块儿进步!

相关文章
相关标签/搜索