Quartz

概要:

​ OpenSymphony提供的强大的开源任务调度框架

​ 官网:http://www.quartz-scheduler.org/

​ 纯Java实现,精细控制排程

特点:

​ 强大的调度功能

​ 灵活的应用方式

​ 分布式和集群能力

主要用到的设计模式:

​ Builder模式

​ Factory模式

​ 组件模式

​ 链式写法

三个核心概念:

​ 调度器:负责定时执行任务

​ 任务:业务逻辑

​ 触发器:让任务生效的时间

Quartz体系结构:

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插件的配置