一. Quartz概念
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合,也可以单独使用。
quartz是开源且具有丰富特性的“任务调度库”,能够集成任何的Java应用,小到独立的应用,大至电子商业系统,quartz能够创建亦简单亦复杂的调度,以执行上十,上百,甚至上万的任务,任务job被定义为标准的Java组件,能够执行任何你想要实现的功能。quartz调度框架包含许多企业级的特性,如JTA事物、集群的支持。
简而言之,quartz就是基于java实现的任务调度框架,用于执行你想要执行的任何任务
官网地址:http://www.quartz-scheduler.org/
二. Quartz运行环境
●Quartz可以运行嵌入在另一个独立式应用程序
●Quartz可以在应用程序服务器(或者servlet容器)内被实例化,并且参与事物
●Quartz可以作为一个独立的程序运行(其自己的Java虚拟机内),可以通过RMI使用。
●Quartz可以被实例化,作为独立的项目集群(负载均衡和故障转移功能),用于作业的执行。
三. Quartz设计模式
●Builder模式
●Factory模式
●组件模式
●链式编程
四.Quartz学习的核心概念
●Job任务
Job就是你想要实现的任务类,每一个job必须实现org.quartz.job接口,且只需实现接口定义的execute()方法。
●Trigger触发器
Trigger为你执行任务的触发器,比如你想每天定时3点发送一份统计邮件,Trigger将会设置3点进行执行该任务。Trigger主要包含两种SimpleTrigger和CronTrigger两种。
●Scheduler调度器
Scheduler为任务的调度器,它会将任务Job及触发器Trigger整合起来,负责基于Trigger设定的时间来执行Job
五.Quartz的体系结构
六.Quartz的几个常用API
以下是Quartz编程API几个重要的接口,也是Quartz的重要组件
●Scheduler 用于与调度程序交互的主程序接口
Scheduler调度程序-任务执行计划表,只有安排进执行计划的任务Job(通过scheduler.scheduleJob方法安排进执行计划),当它预先定义的执行时间到了的时候(任务触发Trigger),该任务才会执行。
●Job 我们预先定义的希望在未来时间被调度程序执行的任务类,我们可以自定义
●JobDetail 使用JobDetail来定义定时任务的实例,JobDetail实例是通过JobBuilder类创建的
●JobDataMap 可以包含不限量的(序列化的)数据对象,在job实例执行的时候,可以使用其中的数据;JobDataMap是Java Map接口的一个实现,额外增加了一些便于存取基本类型的数据的方法。
●Trigger触发器 Trigger对象是用来触发执行Job的,当调度一个Job时,我们实例一个触发器然后调整它的属性来满足job执行的条件。表明任务在什么时候会执行。定义了一个已经被安排的任务将会在什么时候执行的时间条件,比如每一秒执行一次
●JobBuilder 用于声明一个任务实例,也可以定义关于该任务的详情比如任务名,组名等,这个声明的实例将会作为一个实际执行的任务。
●TriggerBuilder 触发器创建器,用于创建触发器trigger实例
●JobListener、TriggerListener、SchedulerListener监听器,用于对组件的监听
七.Quartz的依赖
引入maven依赖
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
</dependency>
八.入门案例
Job任务类:PrintWordsJob
import org.quartz.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
public class PrintWordsJob implements Job {
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
String printTime = new SimpleDateFormat("yy-MM-dd HH-mm-ss").format(new Date());
System.out.println("PrintWordsJob start at:" + printTime + ", prints: Hello Job-" + new Random().nextInt(100));
}
}
启动类MyScheduler
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import java.util.concurrent.TimeUnit;
public class MyScheduler {
public static void main(String[] args) throws SchedulerException, InterruptedException {
// 1、创建调度器Scheduler
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
// 2、创建JobDetail实例,并与PrintWordsJob类绑定(Job执行内容)
JobDetail jobDetail = JobBuilder.newJob(PrintWordsJob.class)
.withIdentity("job1", "group1").build();
// 3、构建Trigger实例,每隔1s执行一次
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "triggerGroup1")
.startNow()//立即生效
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(1)//每隔1s执行一次
.repeatForever()).build();//一直执行
//4、执行
scheduler.scheduleJob(jobDetail, trigger);
System.out.println("--------scheduler start ! ------------");
scheduler.start();
//睡眠
TimeUnit.SECONDS.sleep(10);
scheduler.shutdown();
System.out.println("--------scheduler shutdown ! ------------");
}
}
参考
https://blog.csdn.net/noaman_wgs/article/details/80984873
https://www.bilibili.com/video/BV19t41127de?p=9