一、quartz概念
quartz就是基于java开发的任务调度框架
官网地址
二、quartz的运行环境
- 可以运行嵌入在另一个独立式的应用框架
- 可以在应用服务器(或者servlet容器)内被实例化,并且参与事务
- 可以作为一个独立的程序运行(其自己的java虚拟机中),可以通过RMI使用
- 可以被实例化,作为独立的项目集群(负载均衡和故障转移功能),用于作业的执行
三、quartz的设计模式
- builder模式
- Factory模式
- 组件模式
- 链式编程
四、quartz的核心概念
- 任务job
job就是你想要实现的任务类,每一个job必须实现org.quartz.job接口,且只需要实现接口定义的excute()方法。 - 触发器Trigger
Trigger为你执行任务的触发器,比如n你想每天定时三点发送一份统计邮件,Trigger将会设置3点执行该任务。
Trigger主要包括SimpleTrigger和CronTrigger两种。 - 调度器scheduler
scheduler为任务的调度器,它会将任务job和触发器整合起来,负责基于Trigger设置定时任务来执行job。
五、quartz的结构体系
- start(start()):开始
- stop(shutdown()):停止
- pause:暂停
- resume:恢复
…
六、quartz的几个常用API
以下是Quratz编程的几个重要接口,也是Quratz的重要组件
- scheduler用于与调度程序交互的主程序接口
scheduler调度程序-任务执行计划表,只有安排进执行计划的任务job(通过scheduler.schedulerJob方法安排进入执行计划),当它预先定义的时间到了的时候(任务触发Trigger),该任务才会执行。 - job我们预先定义的希望在未来时间能被调度程序执行的任务类,我们可以自定义。
- jobDetail 使用jobDetail来定义定时任务的实例,jobDetail实例时时通过jobBuilder类创建的。
- jobDateMap 可以包含不限量的(序列化的)数据对象,在job任务执行的时候,可以使用其中的数据;jobDateMap是java Map接口的一个实现,额外增加了一些便于存取基本类型的数据的方法。
- Trigger触发器,Trigger对象是用来触发执行job的。当调度一个job的时候,我们实例一个触发器然后调整它的属性来满足job执行的条件。表明任务什么时候会执行。定义一个已经被安排的任务将会在什么时候执行的时间条件,比如每两秒就执行一次。
- jobBuilder 用于声明一个任务实例,也可以定义该任务的详情比如任务名称,组名等,这个声明的实例将会作为一个实际执行的任务。
- TriggerBuilder 触发器创建器,用于创建触发器Trigger实例。
- JobListener、TriggerListener、SchedulerListener监听器,用于对组件的监听。
七、job与jobDetail的介绍
- job:工作任务调度的接口,具体业务的任务类需要实现该接口。该接口中定义的execute方法,类似JDK提供的TimeTask类中的run方法。在该类中编写具体的业务逻辑。
- job实例在Quartz中的生命周期:每次调度器执行job时,他在调用exceute方法前会创建一个新的job实例,当调用完成后,关联的job对象实例将会被释放,释放的实例会被垃圾回收机制回收。
- jobDetail:jobDetail为job实例提供了许多设置属性,以及jobDetailMap成员变量属性,它用来存储特定job实例的状态信息,调度器需要借助jobDetail对象来添加job实例。
- jobDetail重要属性:name,group,jobClass,jobDetailMap
System.out.println("名称:"+job.getKey().getName());
System.out.println("组的名称:"+job.getKey().getGroup());
System.out.println("任务类:"+job.getKey().getClass());
JobExecutionContext介绍
- 当schescheduler调用一个job的时候,就会将JobExecutionContext传递给job的execute方法;
- job能通过JobExecutionContext对象访问到quartz运行时候的环境以及job本身的明细数据。
。。。。、quartz的使用
maven远程仓库地址:https://mvnrepository.com
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.1</version>
</dependency>
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class Myjob implements Job {
//每次调用都会创建job实例
public Myjob() {
System.out.println("Myjob");
}
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
//输出当前时间
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = simpleDateFormat.format(date);
System.out.println("当前时间是:"+date);
}
}
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
public class HelloSchedulerDemo {
public static void main(String[] args) throws SchedulerException {
//1.调度器scheduler
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
//2.任务实例
JobDetail job = JobBuilder.newJob(Myjob.class)//创建job实例
.withIdentity("job1", "group1")//参数1:任务名称 2:任务组的名称
.build();
//3.触发器Trigger
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "group1")//参数1:触发器名称 2:触发器组的名称
.startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule().repeatSecondlyForever(5))//调度器类型
.build();
//4.关联触发器和任务
scheduler.scheduleJob(job,trigger);
//5.启动
scheduler.start();
}
结果:
Myjob
当前时间是:Sun Jul 12 17:12:13 CST 2020
Myjob
当前时间是:Sun Jul 12 17:12:18 CST 2020