目录
Trigger 概述与常用触发器
1、org.quartz.Trigger 是基接口,具有所有触发器通用的属性,使用 org.quartz.TriggerBuilder 类实例化实际触发器。
2、触发器有一个关联的 TriggerKey,它应该在单个 Scheduler 中唯一标识它们。
3、多个触发器可以指向同一个作业(Job),但是一个触发器只能指向一个作业。
4、触发器可以通过 JobDataMap 放置属性将参数/数据传输到 Job 。《quartz-scheduler 核心 API》
//设置触发器的启动时间为 30 秒后,然后每10秒执行一次任务.
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity(TriggerKey.triggerKey("myTrigger", "myTriggerGroup"))
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(10)
.repeatForever())
.startAt(DateBuilder.futureDate(30, DateBuilder.IntervalUnit.SECOND))
.build();
| SimpleTrigger | 简单触发器,在一个给定的时间时刻,并有选择地以指定的间隔重复。使用 SimpleScheduleBuilder 构建 |
| DailyTimeIntervalTrigger | 每日间隔时间触发器,根据每天的重复时间间隔触发。使用 DailyTimeIntervalScheduleBuilder 构建。 |
| CalendarIntervalTrigger | 日历触发器,以每 N 个日历时间单位触发一次。使用 CalendarIntervalScheduleBuilder 构建. |
| CronTrigger | cron 表达式触发器,灵活指定 年月日时分秒星期。使用 CronScheduleBuilder 构建。 |
Trigger 常用属性
| TriggerKey | 标识 trigger 的身份。键由名称和组构成,且名称在组中必须唯一。TriggerKey(String name, String group),name 不能为 null,否则抛异常,group 为 null 时,使用默认值 “DEFAULT”。 |
| startTime | 1)设置触发器开始的时刻,属性值是 java.util.Date 类型,默认值为 startTime = new Date(); 2)有些类型的 trigger,会在设置的 startTime 时刻立即触发,有些类型的 trigger,则会在 startTime 之后才开始生效。 3)如当前系统时间为1月3号,设置一个 trigger 在每个月的第5天执行任务,startTime 属性设置为 3 月 2 号,则该 trigger 第一次触发是在3月5号,然后是 4月5号,以此类推。 |
| endTime | 设置 trigger 失效的时刻。比如 ”每月第5天执行” 的 trigger,如果其 endTime 是 6 月30 号,则其最后一次执行时间是 6 月 5 号。 |
Trigger 的属性在构建 trigger 的时候可以通过 TriggerBuilder 设置,比如:
//设置触发器的启动时间为 startTime,失效时间为 endTime。
//一到启动时间 SimpleTrigger 就会第一次执行任务,然后间隔 withIntervalInSeconds 继续执行
//直到失效时间不再执行,触发器也会被卸载.
Trigger trigger = TriggerBuilder.newTrigger()
.startAt(startTime)
.endAt(endTime)
.withIdentity(TriggerKey.triggerKey("myTrigger", "myTriggerGroup"))
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(10)
.repeatForever())
.build();
Trigger 优先级 priority
1、如果 trigger 很多,或者 Quartz 线程池的工作线程太少,Quartz 可能没有足够的资源同时触发所有的 trigger,这种情况下可能希望控制哪些 trigger 优先使用 Quartz 的工作线程。
2、Trigger 的 priority 属性用于设置优先级,比如有 30 个 trigger 需要同时触发,但只有 15 个工作线程,此时优先级最高的 15 个 trigger 会被优先触发。如 TriggerBuilder.newTrigger().withPriority(2).xxx;
3、如果没有为 trigger 设置优先级(priority ),则默认为 5;priority 属性值可以是任意整数,正数、负数都可以。数字越小优先级越高
4、只有同时触发的 trigger 之间才会比较优先级,10:59 触发的 trigger 总是在 11:00 触发的 trigger 之前执行。
5、如果 trigger 是可恢复的,在恢复后再调度时,优先级与原 trigger 是一样的。
6、验证非常简单,减小 quartz 线程池中的线程数(quartz.properties Quartz Configuration),然后同时执行多个触发器,观察设置 priority 属性的区别即可 :
#quartz 线程池中的线程个数,如 10 个线程表示最多可以同时执行10个任务/作业
org.quartz.threadPool.threadCount: 10
过期触发策略(misfire Instructions)
1、trigger 的属性 misfireInstruction:表示如果 scheduler 关闭了,或者 Quartz 线程池中因为当时没有可用的线程来执行 job 而错过触发时间,此时持久性的 trigg

本文深入解析Quartz定时任务框架,涵盖Trigger概述、常用触发器、优先级与过期策略、数据持久化等内容,助您掌握Quartz核心概念与高级特性。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



