任务调度之Quartz(二):Quartz体系结构

1、Quartz 体系结构

      由上一篇的Quartz基本使用可以发现,Quartz 主要包含一下几种角色:

            1)Job:也可以认为是JobDtetail,表示具体的调度任务

            2)Trigger:触发器,用于定义任务Job出发执行的规律

            3)Scheduler:调度器,用于将 JobDetail 和 Trigger绑定,并注册到容器中

            4)Listener:监听器,Quartz 中提供了3种监听器,即 JobListener、TriggerListener、

                                  SchedulerListener分别用来监听 Job、Trigger、Scheduler 的执行情况

            5)Jobstore:用来存储任务和触发器相关的信息

           如下图所示:

                  

            注意:

                    由上图可以发现,其中JobDetail是1对多(1:N)的关系,即一个JobDetail可以

                   去绑定多个触发器Trigger

      

2、JobDetail

     由Quartz基本使用笔记可以知道,在 Quartz 中Job需要通过JobBuilder 包装成JobDetail

     后才能被使用,具体用法请参考“Quartz基本使用”。

3、Trigger

      触发器 Trigger 通过Trigger Builder来构建,用于定义任务Job出发执行的规律。

      Trigger 在Quartz 中有4种子接口,分别是:

              

              1)SimpleTrigger:简单触发器,固定时刻或时间间隔触发,单位毫秒

                                   可以定义固定时刻或者固定时间间隔的调度规则(精确到毫秒)。

                                   例如:每天 9 点钟运行;每隔 30 分钟运行一次。

              2)CalendarIntervalTrigge:基于日历的触发器,单位秒,比简单触发器更多时间单位,

                                    支持非固定时间的触发,例如一 年可能 365/366,一个月可能 28/29/30/31

                                    好处是不需要去计算时间间隔,比如 1 个小时等于多少毫秒。

                                    每年的月数和每个月的天数不是固定的,这种情况也适用。   

              3)DailyTimeIntervalTrigger:基于日期的触发器,每天某个时间段触发,即每天的某

                                    个时间段内,以一定的时间间隔执行任务。

                                     例如:每天早上 9 点到晚上 9 点,每隔半个小时执行一次,并且只在

                                                周一到周六执行。

              4)CronTrigger:基于 Cron 表达式的触发器,可以定义基于 Cron 表达式的调度规则,

                                     是最常用的触发器类型。

      

3.1、Cron 表达式

         是一种用于指定定期执行任务的时间规则的字符串表达式。它由6或7个字段组成,

         每个字段代表不同的时间单位,包括秒、分、时、日、月、星期和年。

         Cron表达式通常以空格分隔这些字段,格式如下:

                 秒 分 时 日 月 星期 年

位置时间域特殊值
10-59, - * /
2分钟0-59, - * /
3小时0-23, - * /
4日期1-31, - * ? / L W C
5月份1-12, - * /
6星期1-7, - * ? / L W C
7年份(可选)1-31, - * /

        Cron 表达式特殊值含义:

         1)星号(*):可用在所有字段中,表示对应时间域的每一个时刻,

                             例如,在分钟字段时,表示“每分钟”;

         2)问号(?):该字符只在日期和星期字段中使用,它通常指定为“无意义的值”,

                                  相当于点(.)位符;

         3)减号(-):表达一个范围,如在小时字段中使用“10-12”,则表示从 10 到 12 点,

                              即 10,11,12;

         4)斜杠(/):x/y 表达一个等步长序列,x 为起始值,y 为增量步长值。

                           如:在分钟字段中使用 0/15,则表示为 0,15,30 和 45 秒,而 5/15 在分钟字段

                                 中表示 5,20,35,50,你也可以使用*/y,它等同于 0/y;

         5)L:该字符只在日期和星期字段中使用,代表“Last”的意思,但它在两个字段中意思不

                    同。L 在日期字段中,表示 这个月份的最后一天,如一月的 31 号,非闰年二月

                    的 28 号;如果 L 用在星期中,则表示星期六,等同于 7。但是,如果 L 出现在

                    星期字段里,而且在前面有一个数值 X,则表示“这个月的最后 X 天”,

                    例如:6L 表示该月的最后星期五;

         6)W:该字符只能出现在日期字段里,是对前导日期的修饰,表示离该日期最近的工作日。

                     例如 :15W 表示离该月 15号最近的工作日,如果该月 15 号是星期六,则匹配 14

                                 号星期五;如果 15 日是星期日,则匹配 16 号星期一;如果 15号是星期二,

                                  那结果就是 15 号星期二。但必须注意关联的匹配日期不能够跨月,如你指定

                                  1W,如果 1 号是星期六,结果匹配的是 3 号星期一,而非上个月最后的那

                                   天。W 字符串只能指定单一日期,而不能指定日期范围;

         7)LW 组合:在日期字段可以组合使用 LW,它的意思是当月的最后一个工作日;

         8)井号(#):该字符只能在星期字段中使用,表示当月某个工作日。

                             如 :6#3 表示当月的第三个星期五(6 表示星期五,#3 表示当前的第三个),而

                                    4#5 表示当月的第五个星期三,假设当月没有第五个星期三,忽略不触发;

         9)C:该字符只在日期和星期字段中使用,代表“Calendar”的意思。它的意思是计划所关联

                     的日期,如果日期没有被关联,则相当于日历中所有日期。

                      例如: 5C 在日期字段中就相当于日历 5 日以后的第一天。1C 在星期字段中相当于

                                  星期日后的第一天。

           注意:

                   Cron 表达式对特殊字符的大小写不敏感,对代表星期的缩写英文大小写也不敏感。

4、Scheduler

      调度器Scheduler 是Quartz的指挥官,由StdSchedulerFactory产生。它是单例的。

      Scheduler默认是实现类是StdScheduler,里面包含了一个QuartzScheduler,

      QuartzScheduler里面又包含了一个QuartzSchedulerThread。

      Scheduler中的方法主要分为三大类:

            1)操作调度器本身,例如调度器的启动start()、调度器的关闭shutdown()。

            2)操作Trigger,例如pauseTriggers()、resumeTrigger()。

            3)操作Job,例如scheduleJob()、unscheduleJob()、rescheduleJob()

        Scheduler 方法非常多,这里就不一一列举了。

5、Listener

      Quartz 中提供了3种监听器,即 JobListener、TriggerListener、SchedulerListener分

      别用来监听 Job、Trigger 和 Scheduler 的运行情况。

5.1、JobListener

         JobListener 主要用于监听 JobDetail(即Job) 在运行过程中是否有关键事件发生;

        这些关键事件包括:JobDetail是否被Trigger否决、JobDetail 是否执行完成等。

        JobListener 主要方法包括:

              1)getName():返回JobListener 的名称

              2)jobToBeExecuted():Scheduler 在 JobDetail 将要被执行时调用这个方法

              3)jobExecutionVetoed():Scheduler 在 JobDetail 即将被执行,但又被 TriggerListener

                           否决了时调用这个方法

              4)jobWasExecuted():Scheduler 在 JobDetail 被执行之后调用这个方法

5.2、TriggerListener

         TriggerListener 主要被用来监听触发器Trigger是否被触发,及触发后Job的execute 方法

         是否被执行。

         TriggerListener 常用方法如下:

                1)getName():返回监听器的名称

                2)triggerFired():Trigger 被触发,Job 上的 execute() 方法将要被执行时,Scheduler

                              就调用这个方法

                3)vetoJobExecution():在 Trigger 触发后,Job 将要被执行时由 Scheduler 调用这个

                              方法。TriggerListener 给了一个选择去否决 Job 的执行。假如这个方法返回

                              true,这个 Job 将不会为此次 Trigger 触发而得到执行

                4)triggerMisfired():Trigger 错过触发时调用

                5)triggerComplete():Trigger 被触发并且完成了 Job 的执行时,Scheduler 调用这个

                                方法

5.3、SchedulerListener

        SchedulerListener主要用于监控 Scheduler 的生命周期中是否有关键事件发生,

        当 Scheduler 有关键事件发生时 SchedulerListener 会被调用

        与Scheduler有关的事件包括:增加一个job/trigger,删除一个job/trigger,scheduler

        运行时发送错误,关闭scheduler等。

6、Jobstore

     Jobstore 主要用来存储任务和触发器相关的信息,例如所有任务的名称、数量、状态等等。

     Quartz中有两种存储任务的方式,一种在在内存,一种是在数据库。

6.1、RAMJobstore

      Quartz默认的JobStore是RAMJobstore,也就是把任务和触发器信息运行的信息存储在内

      存中,用到了HashMap、TreeSet、HashSet等等数据结构。

      如果程序崩溃或重启,所有存储在内存中的数据都会丢失。所以我们需要把这些数据持久化

      到磁盘或保存到数据库中。

6.2、JDBCJobStore

        JDBCJobStore可以通过JDBC接口,将任务运行数据保存在数据库中。

        JDBC的实现方式有两种,JobStoreSupport类的两个子类:

        JobStoreTX:在独立的程序中使用,自己管理事务,不参与外部事务。

        JobStoreCMT:(Container Managed Transactions (CMT),如果需要容器管理事务时

                             ,使用它。

         如下图所示:

                

        注意:

                使用JDBCJobSotre时,需要配置数据库信息并创建对应的表结构

                在quartz-jobsb包下,路径 src\org\quartz\impl\jdbcjobstore 下,Quartz

                提供了各种数据库的sql文件,直接拿来执行就行了,如下图所示:

                           

                           

                数据库配置如下:

                       在配置文件 quartz.properties 中配置 数据源信息,如下所示:    

/**JobStore持久化配置:将Quartz的数据保存到数据库中的配置
*/
org.quartz.jobStore.class:org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass:org.quartz.impl.jdbcjobstore.StdJDBCDelegate
# 使用quartz.properties,不使用默认配置
org.quartz.jobStore.useProperties:true
#数据库中quartz表的表名前缀
org.quartz.jobStore.tablePrefix:QRTZ_
org.quartz.jobStore.dataSource:myDS#配置数据源
org.quartz.dataSource.myDS.driver:com.mysql.jdbc.Driver
org.quartz.dataSource.myDS.URL:jdbc:mysql://localhost:3306/quartz?useUnicode=true&characterEncoding=utf8
org.quartz.dataSource.myDS.user:root
org.quartz.dataSource.myDS.password:123456
org.quartz.dataSource.myDS.validationQuery=select 0 from dual

               

quartz 需要的表名称与作用如下:

表名作用
QRTZ_BLOB_TRIGGERSTrigger作为Blob类型存储
QRTZ_CALENDARS存储Quartz的Calendar信息
QRTZ_CRON_TRIGGERS存储CronTrigger,包括Cron表达式和时区信息
QRTZ_FIRED_TRIGGERS存储与已触发的Trigger相关的状态信息,以及相关Job的执行信息
QRTZ_JOB_DETAILS存储每一个已配置的Job的详细信息
QRTZ_LOCKS存储程序的悲观锁的信息
QRTZ_PAUSED_TRIGGER_GRPS存储已暂停的Trigger组的信息
QRTZ_SCHEDULER_STATE存储少量的有关Scheduler的状态信息,和别的Scheduler实例
QRTZ_SIMPLE_TRIGGERS存储SimpleTrigger的信息,包括重复次数、间隔、以及已触的次数
QRTZ_SIMPROP_TRIGGERS存储CalendarIntervalTrigger和DailyTimeIntervalTrigger两种类型的触发器
QRTZ_TRIGGERS存储已配置的Trigger的信息

                

                 

        

                          

          

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/66440.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

十五、Vue 响应接口

文章目录 一、响应式系统基础什么是响应式系统响应式数据的声明与使用二、响应式原理深入Object.defineProperty () 方法的应用(Vue2)Proxy 对象的应用(Vue3)三、响应式接口之 ref 和 reactive(Vue3)ref 函数的使用reactive 函数的使用四、计算属性(computed)作为响应式…

Nature Electronics——近传感器计算:50 nm异构集成技术的革命

创新点:1.高密度互联设计:基于二维材料,开发出互连密度高达62,500 I/O每平方毫米的M3D集成结构。2.异构层堆叠:整合了第二层石墨烯化学传感器和第一层MoS₂记忆晶体管,实现功能互补。3.超短传感器与计算元件距离&#…

Ubuntu 安装 Java 1.8

如果你希望使用 Oracle JDK 8,可以按照以下步骤操作: 下载 Oracle JDK 8: 访问 Oracle 官方网站 下载适用于 Ubuntu 的 JDK 8 版本 安装 Oracle JDK 8: 将下载的 JDK 8 压缩包解压到一个目录中,例如 /opt/module&…

字节青训入营考核十五题-Java-找单独的数

问题 问题描述 在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。有趣的是,除了一个数字之外,所有的数字都恰好出现了两次。现在需要你帮助班长小C快速找到那个拿了独特数字卡片的同学手上的数字是什么。 要求&#xff…

Unity学习之UGUI(三)

十二、Slider 1、作用 Slider是滑动条组件,是UGUI中用于处理滑动条相关交互的关键组件 创建Slider默认包括4个对象 父对象:Slider组件依附的对象 子对象:背景图,进度图,滑动块三组对象 2、主要参数 3、代码控制 voi…

win下搭建elk并集成springboot

一、ELK 是什么? ELK 实际上是三个工具的集合,Elasticsearch Logstash Kibana,这三个工具组合形成了一套实用、易用的监控架构,很多公司利用它来搭建可视化的海量日志分析平台。 ElasticSearch ElasticSearch 是一个基于 Lucen…

基于微信小程序疫苗预约系统ssm+论文源码调试讲解

第四章 系统设计 到目前为止,市面上已经存在了各种各样的软件系统,从系统的分类着手,主要应用范围倾向于办公系统,娱乐系统,社交系统,然后下面有很多比较细的分支系统。很多系统已经经过了市场的考验&…

MySQL慢查询问题排查

第一步:查看当前正在运行的事务状态 select trx_state,trx_started,trx_mysql_thread_id,trx_query from information_schema.innodb_trx; 其中: Trx_state:事务状态 Trx_started:事务启动时间 Trx_mysql_thread_id&…

c++领域展开第十幕——类和对象(内存管理——c/c++内存分布、c++内存管理方式、new/delete与malloc/free区别)超详细!!!!

文章目录 前言一、c/c内存分布二、c的内存管理方式2.1new/delete操作内置类型2.2new和delete操作自定义类型 三、operator new与operator delete函数3.1operator new与operator delete函数 四、new和delete的实现原理4.1 内置类型4.2 自定义类型 五、malloc/free和new/delete的…

MacBook_Xcode_Swift雨燕

Swift Swift Swift Swift是苹果公司开发的现代化编程语言, 专为Apple平台设计。其简洁语法、类型安全、Optionals处理、Playgrounds交互式环境、泛型编程、协议与扩展、闭包功能、枚举与关联值、结构体与类的高效内存管理、异步编程的async/await语法、Swift Packa…

QT自定义工具条渐变背景颜色一例

使用样式定义: QWidget* toolbar new QWidget(this);toolbar->setObjectName("main_tool");toolbar->setStyleSheet("#main_tool{background: qlineargradient(x1:0 , y1:0 , x2:1 , y2:0,""stop:0 rgba(0,255,0, 0.2),"&q…

Flutter 鸿蒙化 flutter和鸿蒙next混和渲染

前言导读 这一个节课我们讲一下PlatformView的是使用 我们在实战中有可能出现了在鸿蒙next只加载一部分Flutter的情况 我们今天就讲一下这种情况具体实现要使用到我们的PlatformView 效果图 具体实现: 一、Native侧 使用 DevEco Studio工具打开 platform_view_example\oho…

React Native 项目 Error: EMFILE: too many open files, watch

硬件:MacBook Pro (Retina, 13-inch, Mid 2014) OS版本:MacOS BigSur 11.7.10 (20G1427) 更新: 删除modules的方法会有反弹,最后还是手动安装了预编译版本的watchman。 React Native 项目运行npm run web,出现如下错误&#xff1a…

倾斜摄影相机在不动产确权登记和权籍调查中的应用

一、项目背景 1.1 项目背景 为贯彻落实中央、国务院关于实施乡村振兴战略、关于“扎实推进房地一体的农村集体建设用地和宅基地使用权确权登记颁证,完善农民闲置宅基地和闲置农房政策,探索宅基地所有权、资格权、使用权‘三权分置’”的要求&#xff0…

2.1.7-1 io_uring的使用

一、背景 (1)下面几个有关异步操作的例子: a)客户端和服务端的异步关系,就是客户端发送请求后不需要等待结果,接下来发送其他请求。 b)对于服务端,客户端来请求后,服务…

Lua开发环境如何安装?保姆级教程

大家好,我是袁庭新。Lua开发环境如何安装搭建?这套篇文章帮你搞定~ CentOS 7系统默认已经安装了Lua语言环境,因此可直接运行Lua代码。可以使用以下命令查看当前系统中默认自带的Lua版本。 # 查看系统默认自带的Lua版本 [rootloc…

SpringBoot入门之创建一个Hello World项目

文章目录 一、使用传统的方式1、创建一个SpringBoot项目2、配置pom.xml文件3、下载Maven依赖4、创建一个Controller类:com.devops.controller.HelloController5、创建一个引导类:com.devops.HelloApplication6、启动项目8、访问80809、完整项目结构 二、…

搜索引擎是如何理解你的查询并提供精准结果的?

目录 一、搜索引擎简单介绍 二、搜索引擎整体架构和工作过程 (一)整体分析 (二)爬虫系统 三个基本点 爬虫系统的工作流程 关键考虑因素和挑战 (三)索引系统 网页处理阶段 预处理阶段 反作弊分析…

vulnhub靶场-potato(至获取shell)

arp-scan -l 扫描IP 使用御剑端口扫描扫描端口,扫到了80和7120两个端口,其中7120为ssh端口 使用dirb http://192.168.171.134 扫描目录 发现info.php 访问为phpinfo界面 访问192.168.171.134为一个大土豆,没什么用 所以我们从ssh入手 盲…

信息科技伦理与道德2:研究方法

1 问题描述 1.1 讨论? 请挑一项信息技术,谈一谈为什么认为他是道德的/不道德的,或者根据使用场景才能判断是否道德。判断的依据是什么(自身的道德准则)?为什么你觉得你的道德准则是合理的,其他…