【定时调度】- 01 quartz的基础你真的了解吗
Quartz一款功能丰富、历史悠久,完全基于Java实现的开源任务调度框架,Java调度领域知名度非常高。其简单易用、稳定可靠的特性,使其被很多第
Quartz
一款功能丰富、历史悠久,完全基于Java实现的开源任务调度框架,Java调度领域知名度非常高。其简单易用、稳定可靠的特性,使其被很多第三方应用将其当成调度框架基础依赖,如spring boot
已内置集成quartz
,elastic-job
调度框架则将quartz
作为其底层基础实现进行封装,xxl-job
曾经历史版本也是集成quartz
作为其触发实现机制基础,不过在最新版本采用时间轮实现已将quartz
移除。
使用quartz api
时,最核心三件套如下:
SchedulerFactory
和Scheduler
从名称就很容易识别这里采用工厂设计模式,Scheduler
是quartz
暴露出来供开发使用的一个最重要组件,从开发者视角来看它就是quartz
的门面,对quartz
的各种操作都是通过Scheduler
进行串联,类似于quartz
的大管家、代言人角色。
(相关资料图)
“这种设计模式在开源框架中很常见,比如
mybatis
中SqlSessionFactory
和SqlSession
,通过给开发者提供大管家组件,通过一个组件串联起所有核心功能,简化了开发人员上手框架难度。
一般一个应用只会对应一个Scheduler
实例,不同Scheduler
实例之间通过schedulerName
进行隔离,所有的quartz
数据库表设计中都有sched_name
这一列字段,这样Scheduler处理任务时只会操作数据库表中对应schedulerName
下的数据。quartz
集群就是利用多个Scheduler
实例配置相同schedulerName
名称,实现多机器同时处理同一个schedulerName
下任务来达到集群效果。
“
schedulerName
可以通过org.quartz.scheduler.instanceName
进行配置,默认名称为QuartzScheduler
。
Scheduler
操作的主要是JobDetail
和Trigger
两个组件,JobDetail
封装的是任务配置信息,而Trigger
触发器封装了任务触发信息,它们是1:N
关系,即一个JobDetail
可以关联多个Trigger
触发器,但是一个Trigger
触发器只能绑定到一个Job上。
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 extends Job> jobClass)
操作绑定任务类,任务类就是封装用户业务逻辑类;2、withIdentity(String name, String group)
给该任务设置一个身份ID,后续可以通过该身份ID进行管理,为方便灵活管理quartz
抽象出group
概念,这样可以批量对一组作业进行批量操作,身份ID使用JobKey
进行封装。
使用Scheduler
类addJob(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
组件常规使用方式如下:
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)
将Trigger
与Job
进行关联,这样才知道触发哪个任务。
最后通过Scheduler
类scheduleJob(Trigger trigger)
方法就将创建的Trigger
定义信息添加到quartz
中,一般采用数据库持久化模式,即这里就会将Trigger
定义信息插入到触发器相关表中,示例中使用cron
触发器,则插入到qrtz_cron_triggers
表中(见下图)。
下面我们就来看下任务是咋个触发的。Scheduler
类scheduleJob(Trigger trigger)
将触发器持久化后,你会发现qrtz_cron_triggers
中没有起止时间以及和Job
绑定内容,所以,接下来我们看一张非常重要表:qrtz_triggers
。scheduleJob()
方法在持久化Trigger
信息后会同时向qrtz_triggers
表插入一条记录(见下图):
qrtz_job_details
和qrtz_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_time
和trigger_state
值更新,重新开始步骤1,就这样循环往复触发下去。
这节从一个使用者角度简单分析quartz
核心运行机制,由于只是简单的从外层而未深入剖析源码,只是简单结合数据库表信息对quartz
大致的运行机制做个简单猜想,一些重要属性也没展开,带着这些疑问下一节通过源码分析找到真实的答案,一步步加深对quartz
运行机制的理解。
关键词:
Quartz一款功能丰富、历史悠久,完全基于Java实现的开源任务调度框架,Java调度领域知名度非常高。其简单易用、稳定可靠的特性,使其被很多第
阿斯:卜拉欣-迪亚斯和弗兰-加西亚将是皇马今夏首批“引援”。据阿斯报的报道,米兰攻击手卜拉欣-迪亚斯和巴列卡诺的边卫弗兰-加西亚(此前已
随着时代的变迁,随着城市的改建,一棵棵苍天大树逐渐演变为一幢幢高楼大厦,住上高档次的新房子已经不是什么稀奇事,在科技日新
打开手机中的支付宝APP,并登录自己的账号;在“支付宝”首页点击右下角“我的”按钮,将界面切换到“我的”界面;找到并点击“余额宝”;在“
3月23日北向资金增持138 12万股驰宏锌锗。近5个交易日中,获北向资金增持的有4天,累计净增持612 69万股。近20个交易日中,获北向资金增持的有
1、你好!12371与全党员管理信息系统不是同一个,12371是党员手机短信平台是传播党的声音的重要窗口,通达社情民意的崭新渠道;全国党员管理信
美股开盘:三大股指集体高开兴登堡研究发布Block做空报告:美股三大股指集体高开,道指高开90点,纳指高开1 2%,标普500指数涨0 71%;Block下跌超
相比之下,女队入选的球员在外界引起了不小的争议,因为根据最新的女单世界排名,国乒在女单世界排名前十,一共有七名球员。这样的做法也引起
进入三月下旬,招生季即将到来。3月22日,光明区教育局发布《关于2023年和2024年义务教育阶段学校学位申请的温馨提醒
亚历山大大帝,欧洲历史上最伟大的四大军事统帅之首。以他的雄才大略,先后统一希腊全境,进而横扫中东地区。这样的一代霸主,他的一生中都有
3月22日,国际高等教育研究机构QSQuacquarelliSymonds发布了第13版QS世界大学学科排名。哈尔滨剑桥学院现代语言学列入QS世界大学学科排
今日黄金价格数据趋势分析(2023年3月23日)
北京高校大学生创业园(沙河园)正式揭牌,可容纳70支创业团队
清明期间宁波公交扫墓专线站点信息(一)8条免费扫墓公交专线考虑到轨道交通已经成网运行,撤销原体育馆、庄桥火车站扫墓专线,通过轨道交通1
一广东省产假规定根据广东省人民政府令第227号《广东省实施〈女职工劳动保护特别规定〉办法》已经2117年11月3日广东省人民政府第十二届85次常
湘西墨戎苗寨银饰卖场销售人员存在欺骗消费者行为投诉直通车是湖南日报、华声在线、新湖南主办的投诉维权类栏目,帮助解决网上投诉,315消费投诉
今年9月份上映电影:《诛仙》、《罗小黑战记》、《踢球吧孩子》、《樵夫廖俊波》、《骑遇》、《老师你会不会回来》、《冷血追击》、《徒手攀岩
当地时间22日晚,巴西中央银行货币政策委员会决定,维持此前13 75%的基准利率不变。巴西央行当天在一份声明中表示,保持基准利率不变,与巴西
一彬科技(001278)03月20日在投资者关系平台上答复了投资者关心的问题。
1、 作为一名默默奉献的教育工作者,时常要开展教案准备工作,借助教案可以恰当地选择和运用教学方法,调动学生学习的积极性
在30~40万级高端汽车市场,燃油车领域一直让德系BBA霸占,新入局的品牌由于品牌力、产品力的劣势,很难突破重围。但在电动车领域,BBA就算有品
2022年妇女节在哪一天是几月几号?2022年03月08日星期二(壬寅虎年)二月月初六。国际妇女节(InternationalWomensDay,简写IW
同花顺金融研究中心3月22日讯,有投资者向神思电子提问,请问贵公司有未接入或者计划接入微软chatgpt和百度文言一心,提升公司业务能力,为客
沃华医药:内部控制自我评价报告
QQ水浒传是一款格斗游戏,武将拥有独立的技能和搭配,不同的人看法不同。比较厉害的武将如下:1、樊瑞:群体伤害在30级之前的武将里是最高的,
Copyright 2015-2022 华东酒业网 版权所有 备案号:京ICP备2022016840号-41 联系邮箱:2 913 236 @qq.com