Quartz(一) 介绍

1.概况:

(1)由OpenSympyony提供的强大的开源任务调度框架
(2)官网:http://www.quartz-scheduler.org/ 纯java实现,精细控制排程
(3)Quartz用一个小Java库发布文件(.jar文件),这个库文件包含了所有Quartz核心功能。这些功能的主要接口(API)是Scheduler接口。它提供了简单的操作,例如:将任务纳入日程或者从日程中取消,开始/停止/暂停日程进度。

2.特点

(1)强大的调度功能
(2) 灵活的应用方式
(3)分布式和集群能力

3.定时器种类

1.SimpleTrigger(常用):用来触发只需执行一次或者在给定时间触发并且重复N次且每次执行延迟一定时间的任务
2.CronTirgger(常用):按照日历触发,例如“每个周五”,每个月10日中午或者10:15分
3.DateIntervalTrigger,
4.NthIncludedDayTrigger和Calendar 类( org.quartz.Calendar)。

4.存储方式

RAMJobStore和JDBCJobStore
对比:

类型 优点 缺点
RAMJobStore 不要外部数据库,配置容易,运行速度快 因为调度程序信息是存储在被分配给JVM的内存里面,所以,当应用程序停止运行时,所有调度信息将被丢失。另外因为存储到JVM内存里面,所以可以存储多少个Job和Trigger将会受到限制
JDBCJobStore 支持集群,因为所有的任务信息都会保存到数据库中,可以控制事物,还有就是如果应用服务器关闭或者重启,任务信息都不会丢失,并且可以恢复因服务器关闭或者重启而导致执行失败的任务 运行速度的快慢取决与连接数据库的快慢

4.主要用到的设计模式

(1) Build模式
(2)Factory模式—调度器使用
(3) 组件模式
(4) 链式写法

5.核心类

说明
QuartzSchedulerThread 负责执行向QuartzScheduler注册的触发Trigger的工作的线程
ThreadPool Scheduler使用一个线程池作为任务运行的基础设施,任务通过共享线程池中的线程提供运行效率
QuartzSchedulerResources 包含创建QuartzScheduler实例所需的所有资源(JobStore,ThreadPool等)
SchedulerFactory 提供用于获取调度程序实例的客户端可用句柄的机制
JobStore 通过类实现的接口,这些类要为org.quartz.core.QuartzScheduler的使用提供一个org.quartz.Job和org.quartz.Trigger存储机制。作业和触发器的存储应该以其名称和组的组合为唯一性
QuartzScheduler 这是Quartz的核心,它是org.quartz.Scheduler接口的间接实现,包含调度org.quartz.Jobs,注册org.quartz.JobListener实例等的方法
Scheduler 这是Quartz Scheduler的主要接口,代表一个独立运行容器。调度程序维护JobDetails和触发器的注册表。 一旦注册,调度程序负责执行作业,当他们的相关联的触发器触发(当他们的预定时间到达时)
JobDetail 传递给定作业实例的详细信息属性。 JobDetails将使用JobBuilder创建/定义
Job 要由表示要执行的“作业”的类实现的接口。只有一个方法 void execute(jobExecutionContext context) (jobExecutionContext 提供调度上下文各种信息,运行时数据保存在jobDataMap中) Job有个子接口StatefulJob ,代表有状态任务。 有状态任务不可并发,前次任务没有执行完,后面任务处于阻塞等到。

6.体系结构 ##

三个核心
(1).调度器
(2). 任务
(3).触发器
Quartz的核心主要包括三部分:任务(Job)、触发器(Trigger)和调度器(Scheduler),其中Scheduler是整个系统框架的心脏和灵魂。

1、任务Job

job是一个接口,只有一个方法void execute(JobExecutionContext context),开发者实现该接口定义运行任务。

JobExecutionContext类提供了调度上下文的各种信息,如获取执行中的JobDetail实例和执行完成后的Trigger对象。当Scheduler决定什么时候执行Job的时候,他会传JobExecutionContext给Job;JobExecutionContext包含了Quartz的运行环境和Job本身的明细数据,相当于ServletContext一样。

JobDetail描述一个给定Job实例的详细信息。JobDetails是通过JobBuilder来创建和定义的。Quartz在每次执行Job时,都重新创建一个Job实例,所以它不直接接收实现Job接口的实例,相反,它接收一个实现Job接口的一个实现类,以便运行时通过newInstace()的反射机制实例化Job。因此需要一个类来描述Job的实现类及其他的相关信息,如Job类名、方法、描述、Key值、关联监听器等信息,JobDetail承担了这一角色。

Job运行时的信息保存在JobDataMap实例中。当需要向Job传值的时候就可以通过JobDataMap传入。

Job状态

有状态的Job(StateFulJob):

在每次执行完Job后JobDataMap中的值就会存储到JobStore中去,所以在下次执行这个Job的时候,JobDataMap中的数据依然存在。可以通过Map中的put()去改变它的值

无状态的Job(Job):

任何时候执行完Job,JobDataMap中的数据都不会被持久化,所以每次创建Job的时候都要对JobDataMap进行数据的添加。

两者区别

两个或者多个有状态的JobDetail实例都不能并发执行,如果一个有状态的JobDetail再创建两个Trigger来触发这个Job,一个每5分钟触发,另一个也是每5分钟触发,两个Tigger试图在同一时间去触发这个Job,框架是不允许这个的事情发生,第二个会一直被阻塞到第一个执行结束,这是基于安全的考虑

2、触发器Trigger

描述触发Job执行的触发时间规则。主要有SimpleTrigger和CronTrigger两个子类。当仅需触发一次或者以固定时间间隔周期执行,SimpleTrigger是最适合的选择;而CronTrigger则可以通过Cron表达式定义出各种复杂时间规则的调度方案:如周一、周三、周五下午5:00执行。

3、调度器(scheduler)

代表一个Quartz的独立运行容器,Trigger和JobDetails可以注册到Scheduler中,两者在Scheduler中拥有各自的组及名称,组及名称是Scheduler查找定位容器中某一对象的依据,Trigger的组及名称必须唯一,JobDetail的组和名称也必须唯一(但可以和Trigger的组和名称相同,因为它们是不同类型的)。Scheduler定义了多个接口方法,允许外部通过组及名称访问和控制容器中Trigger和JobDetail。

Scheduler可以将Trigger绑定到某一JobDetail中,这样当Trigger触发时,对应的Job就被执行。一个Job可以对应多个Trigger,但一个Trigger只能对应一个Job。可以通过SchedulerFactory创建一个Scheduler实例。
这里写图片描述

猜你喜欢

转载自blog.csdn.net/u010520146/article/details/81295475