Quartz
概要:
OpenSymphony提供的强大的开源任务调度框架
官网:http://www.quartz-scheduler.org/
纯Java实现,精细控制排程
特点:
强大的调度功能
灵活的应用方式
分布式和集群能力
主要用到的设计模式:
Builder模式
Factory模式
组件模式
链式写法
三个核心概念:
调度器:负责定时执行任务
任务:业务逻辑
触发器:让任务生效的时间
Quartz体系结构:
重要组成:
-
Job
-
JobDetail
-
JobBuilder
-
JobStore
-
Trigger
-
TriggerBuilder
-
ThreadPool
-
Scheduler
-
Calendar:一个Trigger可以和多个Calendar关联,以排除或者包含某些时间点。
-
监听器:
-
JobListener,TriggerListener,SchedulerListener
-
Job定义
实现业务逻辑的任务接口。
Job接口非常容易实现,只有一个execute方法,类似TimerTask的run方法,在里面编写业务逻辑
Job实例在Quartz中的生命周期
每次调度器执行job时,它在调用execute方法前会创建一个新的job实例。
当调用完成后,关联的job对象实例会被释放,释放的实例会被垃圾回收机制回收。
JobDetail
JobDetail为Job实例提供了许多设置属性,以及JobDataMap成员变量属性,它用来存储特定Job实例的状态信息,调度器需要借助JobDetail对象来添加Job实例。
JobDetail的属性
-
name:代表任务的名称(必须)
-
group:任务所在的组(必须)(DEFAULT)
-
jobClass:任务的实现类(必须)
-
jobDataMap:用来传参
JobExecutionContext是什么
-
当Scheduler调用一个Job,就会将JobExecutionContext传递给Job的execute()方法;
-
Job能通过JobExecutionContext对象访问当Quartz运行时候的环境以及Job本身的明细数据。
jobDataMap是什么
-
在进行任务调度时jobDataMap存储在JobExecutionContext中,方便获取。
-
jobDataMap可以用来装载任何可序列化的数据对象,当job实例对象被执行时这些参数对象会传递给它。
-
jobDataMap实现了JDK的Map接口,并且添加了一些非常方便的方法用来存取基本数据类型。
获取jobDataMap的两种方式
-
从Map中直接获取
-
Job实现类中添加setter方法对应JobDataMap的键值(Quartz框架默认的JobFactory实现类在初始化Job实例对象时会自动地调用这些setter方法)
Tigger是什么
Quartz中的触发器用来告诉调度程序作业什么时候触发,即Trigger对象是用来触发执行Job的。
Tigger通用属性
-
JobKey:表示job实例的标识,触发器被触发时,该指定的job实例会执行。
-
StartTime:表示触发器的时间表首次被触发的时间。它的值的类型是Java.util.Date
-
EndTime:指定触发器的不再被触发的时间。它的值的类型是Java.util.Date
SimpleTrigger的作用
在一个指定时间段内执行一次作业任务,或者在指定的时间间隔内多次执行作业任务。
需要注意的点
-
重复次数可以为0,正整数或者是SimpleTrigger.REPEAT_INDEFINITELY
-
重复执行间隔必须为0或长整数
-
一旦被指定了endTime参数,那么它会覆盖重复次数参数的效果
CronTrigger的作用
基于日历的作业调度器,不是精确指定间隔时间,更常用。
Cron表达式
用于配置CronTrigger实例。
是由7个子表达式组成的字符串,描述了时间表的详细信息。格式:【秒】【分】【小时】【日】【月】【周】【年】
Scheduler-工厂模式
-
所有的Scheduler实例应该由SchedulerFactory来创建
StdSchedulerFactory
-
使用一组参数(Java.util.Properties)来创建和初始化Quartz调度器
-
配置参数一般存储在quartz.properties中
-
调用getScheduler方法就能创建和初始化调度器对象
Scheduler的主要函数
-
Date sshedulerJob(JobDetail jobDetail,Trigger trigger) 最近的一次要执行的时间
-
void start():启动
-
void standby():暂时挂起暂停程序
-
void shutdown():关闭Scheduler不能被重启
quartz.properties
文档的位置和加载顺序
组成部分
-
调度器属性
-
org.quartz.scheduler.instanceName属性用来区分特定的调度器实例,可以按照功能通途来给调度器起名。
-
org.quartz.scheduler.instanceId属性和前者一样,也允许任何字符串,但这个值必须是在所有调度器实例中是唯一的,尤其是在第一个集群当中,作为集群的唯一key。假如你想Quartz帮你生成这个值得话,可以设置为AUTO。
-
-
线程池属性
-
threadCount:直接决定了这个Quartz需要有多少个工作者线程被创建。至少为1。建议小于100。
-
threadPriority:最大值10,最小值为1,正常值是5.代表优先级.用于集群
-
org.quartz.threadPool.class:
-
-
作业存储设置
-
描述了在调度器实例的生命周期中,Job和Trigger信息是如何被存储的。
-
-
插件配置
-
满足特定需求用到的Quartz插件的配置
-