• 【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,谢谢两位作者。

  • 相关阅读:
    LeetCode 3-Longest Substring Without Repeating Characters
    LeetCode 2-Add Two Numbers
    LeeCode 1-Two Sum
    Python中Lambda, filter, reduce and map 的区别
    解决Eclipse10配置Pydev不成功的问题
    Pythonxy下载链接
    546C. Soldier and Cards
    欧拉工程第58题:Spiral primes
    欧拉工程第57题:Square root convergents
    Linux编辑器vim键盘详解
  • 原文地址:https://www.cnblogs.com/xiongxx/p/8994702.html
Copyright © 2020-2023  润新知