【Quartz】基本原理

1 核心概念

1.1    核心元素

(1)Scheduler

       任务调度器,是Quartz框架的核心,负责管理其他组件。

(2)Trigger

  触发器,用于定义任务调度的时间规则,有SimpleTrigger、CronTrigger、DateIntervalTrigger和NthIncludedDayTrigger。

trigger还有一个重要的属性misfire;如果scheduler关闭了,或者Quartz线程池中没有可用的线程来执行job,此时持久性的trigger就会错过(miss)其触发时间,即错过触发(misfire)。不同类型的trigger,有不同的misfire机制。它们默认都使用“智能机制(smart policy)”,即根据trigger的类型和配置动态调整行为。当scheduler启动的时候,查询所有错过触发(misfire)的持久性trigger,然后根据它们各自的misfire机制更新trigger的信息。

(3)Job

     任务,即要被执行的任务。作业是一个执行任务的简单Java类,只需你实现org.quartz.Job接口并且在出现严重错误情况下抛出JobExecutionException异常即可。一个 job 可以被多个 trigger 关联,但是一个 trigger 只能关联一个 job。

Job接口包含唯一的一个方法execute(),作业从这里开始执行。一旦实现了Job接口和execute()方法,当Quartz确定该是作业运行的时候,它将调用你的作业。Execute()方法内就完全是你要做的事情。

主要有两种类型的 job:无状态的(stateless)和有状态的(stateful)。对于同一个 trigger 来说,有状态的 job 不能被并行执行,只有上一次触发的任务被执行完之后,才能触发下一次执行。有状态作业在每次执行时只有一个实例,每次执行时会查看JobDataMap的状态改变。Job 主要有两种属性:volatility 和 durability,其中 volatility 表示任务是否被持久化到数据库存储,而 durability 表示在没有 trigger 关联的时候任务是否被保留。两者都是在值为 true 的时候任务被持久化或保留。

2 数据存储

  作业一旦被调度,调度器需要记住并且跟踪作业和它们的执行次数。Quartz通过一个称之为作业存储(JobStore)的概念来做作业存储和管理。   Quartz 中有两种存储方式:

(1)RAMJobStore

  使用内存来持久化调度程序信息。优点是容易配置、构造和运行。缺点是当应用程序停止运行时,所有调度信息将被丢失。

(2)JobStoreSupport

  通过JDBC存储数据到数据库中。quartz集群是通过数据库表来感知其他的应用的,各个节点之间并没有直接的通信。只有使用持久的JobStore才能完成Quartz集群。有两种类型:

· JobStoreTX:自己控制事务时使用

· JobStoreCMT:容器控制事务时使用

数据库表有:

Table name

Description

QRTZ_CALENDARS

存储Quartz的Calendar信息

QRTZ_CRON_TRIGGERS

存储CronTrigger,包括Cron表达式和时区信息

QRTZ_FIRED_TRIGGERS

存储与已触发的Trigger相关的状态信息,以及相联Job的执行信息

QRTZ_PAUSED_TRIGGER_GRPS

存储已暂停的Trigger组的信息

QRTZ_SCHEDULER_STATE

存储少量的有关Scheduler的状态信息,和别的Scheduler实例

QRTZ_LOCKS

存储程序的悲观锁的信息

QRTZ_JOB_DETAILS

存储每一个已配置的Job的详细信息

QRTZ_SIMPLE_TRIGGERS

存储简单的Trigger,包括重复次数、间隔、以及已触的次数

QRTZ_BLOG_TRIGGERS

Trigger作为Blob类型存储

QRTZ_TRIGGERS

存储已配置的Trigger的信息

QRTZ_SIMPROP_TRIGGERS

  

  本文也参考了https://blog.csdn.net/lkl_csdn/article/details/73613033和https://blog.csdn.net/guolong1983811/article/details/51501346,谢谢两位作者。

原文地址:https://www.cnblogs.com/xiongxx/p/8994702.html