当前位置:首页>滚动 > >正文

【定时调度】- 01 quartz的基础你真的了解吗-环球头条

  • 2023-03-25 21:04:11来源:腾讯云

概述

Quartz一款功能丰富、历史悠久,完全基于Java实现的开源任务调度框架,Java调度领域知名度非常高。其简单易用、稳定可靠的特性,使其被很多第三方应用将其当成调度框架基础依赖,如spring boot已内置集成quartzelastic-job调度框架则将quartz作为其底层基础实现进行封装,xxl-job曾经历史版本也是集成quartz作为其触发实现机制基础,不过在最新版本采用时间轮实现已将quartz移除。


(资料图)

核心三叉戟

使用quartz api时,最核心三件套如下:

Scheduler

SchedulerFactoryScheduler从名称就很容易识别这里采用工厂设计模式,Schedulerquartz暴露出来供开发使用的一个最重要组件,从开发者视角来看它就是quartz的门面,对quartz的各种操作都是通过Scheduler进行串联,类似于quartz的大管家、代言人角色。

“这种设计模式在开源框架中很常见,比如mybatisSqlSessionFactorySqlSession,通过给开发者提供大管家组件,通过一个组件串联起所有核心功能,简化了开发人员上手框架难度。

一般一个应用只会对应一个Scheduler实例,不同Scheduler实例之间通过schedulerName进行隔离,所有的quartz数据库表设计中都有sched_name这一列字段,这样Scheduler处理任务时只会操作数据库表中对应schedulerName下的数据。quartz集群就是利用多个Scheduler实例配置相同schedulerName名称,实现多机器同时处理同一个schedulerName下任务来达到集群效果。

schedulerName可以通过org.quartz.scheduler.instanceName进行配置,默认名称为QuartzScheduler

Scheduler操作的主要是JobDetailTrigger两个组件,JobDetail封装的是任务配置信息,而Trigger触发器封装了任务触发信息,它们是1:N关系,即一个JobDetail可以关联多个Trigger触发器,但是一个Trigger触发器只能绑定到一个Job上。

JobDetail

JobDetail组件封装了quartz调度任务定义信息,下面是JobDetail组件常规使用方式如下:

// JobDataMap实现Map接口,任务调度时存储到JobExecuteContext中,可以传递给Job实例JobDataMap jobDataMap = new JobDataMap();jobDataMap.put("name", "zhangsan");jobDataMap.put("time", System.currentTimeMillis());JobDetail jobDetail = JobBuilder      // 绑定任务类            .newJob(QuartzCronJob.class)            .storeDurably()      // job对应ID            .withIdentity("job2", "DEFAULT")             .usingJobData(jobDataMap)            .build();JobKey jobKey = jobDetail.getKey();if (scheduler.checkExists(jobKey)) { log.warn("调度任务已存在,删除后重新添加:{}", jobKey); scheduler.interrupt(jobKey);//停止JOB    /**      * deleteJob操作在删除Job之前,会执行unscheduleJob()取消job和trigger关联    */    scheduler.deleteJob(jobKey);}// 将JobDetail任务定义信息插入quartz表scheduler.addJob(jobDetail, true);

JobDetail操作比较简单,主要有两点需要注意:1、newJob(Class jobClass)操作绑定任务类,任务类就是封装用户业务逻辑类;2、withIdentity(String name, String group)给该任务设置一个身份ID,后续可以通过该身份ID进行管理,为方便灵活管理quartz抽象出group概念,这样可以批量对一组作业进行批量操作,身份ID使用JobKey进行封装。

使用ScheduleraddJob(JobDetail jobDetail, boolean replace)方法就将创建的Job定义信息添加到quartz中,一般采用数据库持久化模式,即这里就会将Job定义信息插入到qrtz_job_details表中(见下图)。

下面来看下几个关键字段:

sched_name:上面说过,用来关联对应的Scheduler实例is_durable:是否持久化is_nonconcurrent:是否允许同一个作业可以同时多个实例执行,比如一个任务间隔1秒,但其执行时间为2秒,通过该属性控制是否允许同一个作业有多个任务同时允许,参见@DisallowConcurrentExecutionis_update_data: 任务已经执行中,是否允许更新JobDataMap持久化信息,参见@PersistJobDataAfterExecutionrequests_recovery: 故障恢复使用,具体参见后续源码分析job_data:JobDataMap序列化后存储到字段中

Trigger

任务定义完成,但是任务按照怎么周期性规则进行触发执行,这就要看Trigger触发器的脸色了

Trigger组件常规使用方式如下:

JobDataMap jobDataMap = new JobDataMap();jobDataMap.put("name", "lisi");jobDataMap.put("address", "China");Trigger trigger = TriggerBuilder            .newTrigger()            .withIdentity("trigger1", "DEFAULT")            .usingJobData(jobDataMap)            .startAt(new Date())            .endAt(new Date(System.currentTimeMillis()+38 * 60 * 1000))            .withSchedule(CronScheduleBuilder.cronSchedule("*/10 * * * * ?"))            .forJob(new JobKey("job1", "DEFAULT"))            .build();//时间TriggerKey triggerKey = trigger.getKey();if(scheduler.checkExists(triggerKey)){ scheduler.unscheduleJob(triggerKey);}//必须绑定jobscheduler.scheduleJob(trigger);

JobDetail类似,主要有两点需要注意:1、同withIdentity(String name, String group),同理给该触发器设置一个身份ID,对应TriggerKey;2、startAt()endAt()对应启止时间;3、withSchedule(CronScheduleBuilder.cronSchedule("*/10 * * * * ?"));4、forJob(JobKey keyOfJobToFire)TriggerJob进行关联,这样才知道触发哪个任务。

最后通过SchedulerscheduleJob(Trigger trigger)方法就将创建的Trigger定义信息添加到quartz中,一般采用数据库持久化模式,即这里就会将Trigger定义信息插入到触发器相关表中,示例中使用cron触发器,则插入到qrtz_cron_triggers表中(见下图)。

下面我们就来看下任务是咋个触发的。SchedulerscheduleJob(Trigger trigger)将触发器持久化后,你会发现qrtz_cron_triggers中没有起止时间以及和Job绑定内容,所以,接下来我们看一张非常重要表:qrtz_triggersscheduleJob()方法在持久化Trigger信息后会同时向qrtz_triggers表插入一条记录(见下图):

qrtz_job_detailsqrtz_cron_triggers可以看成静态表,那qrtz_triggers就是运行动态表,保存着任务运行期间数据,且随着运行记录在动态变更,是quartz调度任务运行最重要的一张表,下面我们来看下这张表中几个关键字段:

start_time、end_time: trigger定义时设置的起止时间next_fire_time: 下次触发时间戳prev_fire_time: 上次触发时间戳trigger_state: trigger状态,最常见状态WAITING、ACQUIRED和EXECUTING,分别对应等待(下次触发时间还早) -> 加载到内存中等待(下次触发时间快到了) --> 执行(下次触发时间到了,需要触发任务),具体参见后续源码分析misfire_instr: trigger触发时间过期处理策略,比如本来是10:23:50时间点进行触发,但是由于某些原因在10:23:53秒才检索出来,这是该触发时间点已经过期,misfire_instr就是控制采用什么策略处理该过期任务,是直接丢弃重新计算下次触发时间点、还是一定时间范围内过期的理解执行等等,具体参见后续源码分析job_data: 和JobDetail一样,Trigger也可绑定一个JobDataMap,用于向Job实例传递参数,该字段就是存储Trigger关联的JobDataMap序列化内容

quartz基本上就是围绕qrtz_triggers中这几个关键字段实现任务触发,我们连蒙带猜大致可以想出quartz任务调度触发机制粗略流程:

1、通过配置的trigger触发器,计算出下次触发时间,更新到next_fire_time字段,同时更新trigger_state状态为WAITING

2、quartz线程扫描该表,从表中查询出未来很短一段时间将要触发的记录(比对next_fire_time和当前时间)放入到内存排队队列中,然后将trigger_state更新成ACQUIRED

3、然后阻塞直到内存排队队列中触发任务到时间点,再触发任务之前,重新计算下次触发时间点,更新到next_fire_time,同时将trigger_state更新为WAITING,然后执行当前任务;

4、由于next_fire_timetrigger_state值更新,重新开始步骤1,就这样循环往复触发下去。

总结

这节从一个使用者角度简单分析quartz核心运行机制,由于只是简单的从外层而未深入剖析源码,只是简单结合数据库表信息对quartz大致的运行机制做个简单猜想,一些重要属性也没展开,带着这些疑问下一节通过源码分析找到真实的答案,一步步加深对quartz运行机制的理解。

标签:

延伸阅读

推荐阅读

【定时调度】- 01 quartz的基础你真的了解吗-环球头条

Quartz一款功能丰富、历史悠久,完全基于Java实现的开源任务调度框架,Java调度领域知名度非常高。其简单易用、稳定可靠的特性,使其被很多第

dnf白金徽章怎么得|世界热议

1、我们获得徽章的最容易的方法,也是最常用的方法就是分解时装,我们分解时装即可获得各种类型的徽章。但是我们要向获得白金徽章,还是要分解

西十高铁湖北段建设全面提速:汉江特大桥420米一跨过江 环球播资讯

西十高铁湖北段建设全面提速:汉江特大桥420米一跨过江

全球热讯:mcafee卸载不了 拒绝访问(mcafee卸载不了)

大家好,小城来为大家解答以上问题。mcafee卸载不了拒绝访问,mcafee卸载不了很多人还不知道,现在让我们一起来看看吧!1、1 点击电脑左

列宾作品超清图片_列宾作品 全球聚焦

1、С1882РепинжилвПетербурге Конец1870-х-1880-егг н

速看:玉蜻蜓的养殖方法和注意事项

1、温度:它比较喜欢温暖的环境,养护时宜将它周围的温度控制在20-30℃之间,2、浇水:一般每10天左右浇一次就行了。不能过于频繁地浇水,不然

续航超700km,奥迪又造出了电动时代的最强瓦罐?

谈到“瓦罐”,相信很多人第一时间都会想到奥迪。“瓦罐”,又叫旅行车。尽管直到今天,旅行车的用户群体依旧小众,但由于其优雅

湘潭县市场监管部门多措并举护航春耕备耕 环球速讯

红网时刻湘潭县频道讯(通讯员邓念华)正值春耕备耕关键时节,也是农资供应的关键时期,近日,湘潭县市场监督管理局多措并举全力护航春耕备耕

全球观焦点:走进瑞尔集团,走向口腔健康

$瑞尔集团(06639)$首先感谢雪球组织的这次活动,也特别感谢瑞尔集团热情的接待!这次真的是我参加过的历次活动里最好的一次,为什么这么说呢?

天天消息!完美有瑕:一枚劳力士手表的故事

一件物品之所以珍稀,可能是因为它有着特定来源,曾属名人珍藏,或在著名的历史事件中起了作用;又或者,它是一件大师之作,由极其稀缺的原材

一巴掌打的是外卖小哥,心寒的是全国人民的心|每日速读

一巴掌打的是外卖小哥,心寒的是全国人民的心,巴掌,交警,电瓶车,外卖小哥

环球信息:鲁能巴蜀中学和巴蜀中学是一个吗

不是同一个学校。因为重庆巴蜀中学是重庆市教委直属的公立学校,重庆鲁能巴蜀中学是一所股份制民办中学。鲁能巴蜀中学不是重庆巴蜀中学的分校

当前最新:“省钱经济”快跑

21世纪经济报道记者贺泓源北京报道消费者更爱省钱了。耐克财报显示,截至2月28日的前三个月,该公司大中华区营收19 9亿美元,同比下滑7 7%,货

赛力斯:公司增程器可实现一升油发 3.27 度电

同花顺金融研究中心3月24日讯,有投资者向赛力斯提问,公司增程器配套的发电机是扁线电机还是圆线电机?增程器动力总成1L汽油能发多少度电? 

更方便!大兴机场飞往广州、深圳每30分钟一班

针对飞往广州、深圳两地的核心商务快线,高峰时刻满足每半小时即可有一班,实现北京大兴飞广深两地航班“公交化”。

从种到收全程“大托管”模式 为农户量身定制专属耕作方案 世界快资讯

从种到收全程“大托管”模式为农户量身定制专属耕作方案---多地小麦也陆续进入返青、拔节期,麦田春管到了重要关口。各地农户抢抓农时,利...

热推荐:中能专访|郑会龙:上天玩火?这太酷了!

访“梦天”实验舱燃烧科学实验柜总设计师郑会龙中国能源新闻网记者于琳娜燃烧与能源息息相关,我们获取动力的很多方式都是依靠燃烧,火电站...

塘鲺是什么_每日播报

1、塘鲺是一种鱼类,可食用,塘虱就是鲶鱼。埃及塘虱学名埃及胡子鲶,又叫革极子鲶,是一种原产于非洲尼罗河流域的淡水鲶类。近年来,埃及塘角鱼

泰安税务:税惠“春风”护航小微企业行稳致远

今年是开展“便民办税春风行动”的第十年,国家税务总局泰安市税务局紧紧围绕“办好惠民事·服务现代化”主题,通过送政策、智慧办等举措,...

加NIR红光技术,两千多入手爱德华医生天使之光2润眼灯,值吗? 全球观焦点

科技是一面双刃剑,便利了生活的同时,对视力的影响也很大,例如,手机、平板、电视、电脑方便孩子学习的同时,也要面临近视的风险。视力问题

【全球快播报】中考5:5分流将取消,中职也能上本科·5月1日实施

中考5:5分流将取消,中职也能上本科·5月1日实施​职业教育会和本科教育相互融通​究竟是分流取消还是给了中职的孩子更多的出路呢?​这个...

厦门市科技创新大会即将召开

记者23日从厦门市科学技术局获悉,筹备已久的厦门市科技创新大会将于3月29日召开,届时将有众多国内外顶尖科学家、知名企业家、国家级科研机构

四部门: 开展农村能源革命试点县建设

3月15日,国家能源局、生态环境部、农业农村部、国家乡村振兴局发布《关于组织开展农村能源革命试点县建设的通知》,其中提到:重点任务(一)推动

不知反省死性最难改的生肖排行

有句俗话这么说来着:狗改不了吃屎,虽然听起来让人不舒服,却话糙理不糙。有些人,虽然口头上再三反省要改过自新,实际行动却一点没变,原先

又吵上了热搜:网友称海底捞水果仅限打包一份_焦点短讯

又吵上了热搜:网友称海底捞水果仅限打包一份

重庆方言版歌曲_重庆方言的歌曲有哪些? 新消息

1、《我是重庆崽儿》,《闹啥子嘛闹》,《明天不上班》《天干物燥》《山城》。本文到此结束,希望对大家有所帮助。

瑞信称5.714亿美元的美元债券已有效提交_环球今亮点

3月23日电,3月23日,瑞信周四在声明中表示,5 714亿美元的美元债券已有效提交。据报道,瑞信3月15日宣布就10亿

微速讯:星战人物图集:第一秩序防暴兵

防暴冲锋队(riotcontrolstormtrooper)防暴冲锋队是第一秩序标准冲锋队的特殊变体。他们被指派在一序领土内维持世界秩序,他们接受了防暴战术

东方证券给予中信特钢买入评级 彰显弱周期属性 “十四五”目标加速迈进

东方证券03月22日发布研报称,给予中信特钢(000708 SZ,最新价:17 94元)买入评级。评级理由主要包括:1)积极抵御需求弱势,稳健经营穿越周期

鹅鹅鹅作者|环球资讯

1、鹅鹅鹅的作者是骆宾王。2、骆宾王(别称:骆临海,约619年-约687年),字观光,婺州义乌(今浙江义乌)人,唐代诗人,与王勃、卢照邻、杨炯

猜您喜欢

Copyright ©  2015-2022 华南服装网版权所有  备案号:粤ICP备18025786号-52   联系邮箱: 954 29 18 82 @qq.com