Quartz任务调度学习
Quartz
灵感:https://www.cnblogs.com/davidwang456/p/3858980.html
Quartz提供了JobExecutionContext上下文通过JobDataMap传递数据。
代码文件 |
功能要点 |
|
设置数据 |
QuartzConfig.java |
创建JobDetail或者Trigger时,调用usingJobData()设置数据 |
读取数据 |
QuartzJob.java |
执行任务时,调用JobExecutionContext.getMergedJobDataMap()获取数据 |
Quartz是Java领域最著名的开源任务调度工具,是一个任务调度框架,通过触发器设置作业的定时运行规则,来执行定时任务。其中quartz集群通过故障切换和负载平衡的功能,能给调度器带来高可用性和伸缩性。
Quartz提供了极为广泛的特性如持久化任务,集群和分布式任务等
Quartz框架主要核心组件包括:
1.Scheduler任务调度
是最核心的概念,需要把JobDetail和Trigger注册到scheduler中,才可以执行。
工厂模式,组装各个组件 sched.scheduleJob(job, trigger);
2.Job任务,JobExecutionContext类提供调度上下文的各种信息
其实Job是接口,其中只有一个execute方法,我们只需要 implements 此接口,重写 execute(*) 方法。
实现Job接口的类还可以使用注解进行修饰
@DisallowConcurrentExecution:此注解表示不允许这个Job并发执行
@PersistJobDataAfterExecution:此注解表示当这个Job的execute方法执行成功后,更新并存储它所持有的JobDetail属性中JobDataMap。如果使用这个注解,强烈建议也使用@DisallowConcurrentExecution,因为并发执行过程中,JobDataMap有可能会发生冲突。
3.Trigger触发器/TruggerBuilder(创建Trigger)/ThreadPool(线程)
执行任务的规则;比如每天,每小时等。
一般情况使用SimpleTrigger,和CronTrigger,这些触发器实现了Trigger接口。或者 ScheduleBuilder 子类 SimpleScheduleBuilder和CronScheduleBuilder。
对于简单的时间来说,比如每天执行几次,使用SimpleTrigger。
对于复杂的时间表达式来说,比如每个月15日上午几点几分,使用CronTrigger以及CromExpression 类。
Priority:这个属性表示Trigger的权重。当两个Trigger触发时间相同时,权重大的那个先执行。Quartz默认的权重值为5。
Misfire Instruction:在Trigger接口中可以设置错过触发处理机制
4.JobDetail任务细节/JobBuilder(创建JobDetail)/JobStore保存Job数据:保存内存或数据库中)/JobDataMap:JSON数据格式
任务细节,Quartz执行Job时,需要新建个Job实例,但是不能直接操作Job类,所以通过JobDetail来获取Job的名称、描述信息。
JobDetail有两个boolean属性。
isDurable:如果设为false,则对应的Job一旦没有关联的触发器,就会被Scheduler自动删除。 requestsRecovery:如果设为true,当Job执行中遇到硬中断(例如运行崩溃、机器断电等),Scheduler会重新执行。这种情况下,
JobExecutionContext.isRecovering()会返回ture。
5.Calendar(排除某个任务不执行)
一个Trigger可以和多个Calendar关联
6.监听器JobListener TriggerListener SchedulerListener
7.JobKey 和 TriggerKey
在Quartz中,可以分别通过JobKey和TriggerKey来唯一地识别一个Job或一个Trigger。
这两个Key都有两个关键属性:name和group。
调度器作为作业的总指挥,触发器作为作业的操作者,作业为应用的功能模块。
CronExpression表达式
CronTrigger配置完整可是为:[秒] [分] [小时] [日] [月] [周] [年](年可选)
* 表示所有值
? 表示不指定值,例如:要在每月的10号触发一个操作,但不关心是周几,所以需要周位置的那个字段设置为"?" 具体设置为 0 0 0 10 * ?
- 表示区间, 例如在小时上设置 "10-12",表示 10,11,12点都会触发。
/用于递增触发,例如在秒上面设置"5/15"表示从5秒开始,每增15秒触发(5,20,35,50)。在月字段上设置'1/3'所示每月1号开始,每隔三天触发一次
L 表示最后的意思, 例如在日字段设置上,表示当月的最后一天(依据当前月份,如果是二月还会依据是否是润年[leap]), 在周字段上表示星期六,相当于"7"或"SAT"。如果在"L"前加上数字,则表示该数据的最后一个。例如在周字段上设置"6L"这样的格式,则表示“本月最后一个星期五"
W 表示离指定日期的最近那个工作日(周一至周五)
例如在日字段上设置"15W",表示离每月15号最近的那个工作日触发。如果15号正好是周六,则找最近的周五(14号)触发, 如果15号是周未,则找最近的下周一(16号)触发。如果15号正好在工作日(周一至周五),则就在该天触发。如果指定格式为 "1W",它则表示每月1号往后最近的工作日触发。如果1号正是周六,则将在3号下周一触发。(注,"W"前只能设置具体的数字,不允许区间"-")。
小提示:'L'和 'W'可以一组合使用。如果在日字段上设置"LW",则表示在本月的最后一个工作日触发;周字段的设置,若使用英文字母是不区分大小写的,即MON与mon相同。
# 表示 每月的第几个周几
例如在周字段上设置"6#3"表示在每月的第三个周六。注意如果指定"#5",正好第五周没有周六,则不会触发该配置(用在母亲节和父亲节再合适不过了)。
注:表中月份一行的JAN-DEC,是指一月到十二月的英文缩写;星期一行的SUN-SAT,是指星期天到星期六的英文缩写。
表达式案例
在Quartz中有两类线程模型:
1.Scheduler调度线程:QuartzSchedulerThread调度主线程QuartzScheduler被创建时创建一个QuartzSchedulerThread实例。
2.任务执行线程:任务执行线程Quartz不会在主线程(QuartzSchedulerThread)中处理用户的Job。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现