Quartz所使用的表的说明
Quartz是一个强大的开源任务调度框架,它可以用来定时执行计划任务。在Quartz中,表是一个非常关键的概念,它定义了Quartz如何计算一个任务的执行时间,同时也把任务的执行时间和执行频率从代码中解耦,使得任务的调度配置变得简单和灵活。本文将对Quartz所使用的表进行详细的说明。
表的通用格式
Quartz中的表是通过一个类似于cron表达式的字符串来描述的,它由7个字段组成,以空格分隔。具体格式如下:
[秒] [分] [小时] [日] [月] [周] [年]
其中,方括号中的部分是可选的。
在Quartz中,每个字段都可以使用通配符(*),也可以指定一个范围(range),使用逗号(,)来分隔多个取值,使用斜杠(/)指定取值的间隔,使用问号(?)来代表不关心的字段。
除了通配符以外,Quartz中的表还支持一些特殊字符:
- “-” 表示范围,如“10-15”表示从10到15;
- “/” 表示间隔,如“0/5”表示每隔5秒执行一次;
- “L” 表示最后一个,只能出现在日期和星期的字段中。如“L”表示当月的最后一天,“6L”表示当月的最后一个星期五;
- “W” 表示工作日,只能出现在日期字段中。如“15W”表示离指定日期最近的工作日;
- “#” 表示第几个,只能出现在星期字段中。如“3#2”表示本月的第二个星期三;
Quartz所使用的表
在Quartz中,有两种类型的表:Trigger表和Calendar表。
Trigger表
Trigger表用于定义任务的执行时间和重复策略。Quartz中的触发器(trigger)可以分为3类:SimpleTrigger、CronTrigger和CalendarIntervalTrigger。
SimpleTrigger表达式的格式如下:
[秒] [开始时间] [结束时间] [重复次数] [重复间隔]
其中,开始时间和结束时间必须是一个绝对值的日期时间,重复次数和重复间隔可以使用“-1”和“0”来表示不重复或无限重复。例如,以下表达式表示在2022年1月1日8点执行一次任务,然后每隔5分钟再次执行,直到2022年1月1日10点结束:
0 0 8-10 ? 1 1/5 * 2022
CronTrigger表达式的格式如下:
[秒] [分] [小时] [日] [月] [周] [年]
这个表达式的各个字段含义和通用表达式一样,只不过可以使用Quartz独有的“?”字符,代表不关心的字段。例如,以下表达式表示在每个小时的第10分钟和第50分钟都执行一次任务:
0 10,50 * ? * * *
CalendarIntervalTrigger表达式的格式如下:
[开始时间] [结束时间] [重复间隔] [时间单位]
其中,时间单位可以是秒、分钟、小时、天、周或月,重复间隔是一个整数。例如,以下表达式表示从2022年1月1日开始,每隔7天执行一次任务,直到2022年12月31日结束:
0 0 0 1 1 ? * #2022-12-31 0/7
Calendar表
Calendar表用于定义Quartz的日历,它可以包含一些排除的日期或时间段,以便在任务调度时将其排除在外。例如,我们可以创建一个日历,将所有的工作日都排除在外,只在周末执行任务:
Calendar calendar = new DailyCalendar("08:00", "17:00");
calendar.setDaysExcluded(new boolean[] { false, false, true, true, true, true, false });
scheduler.addCalendar("workdayCalendar", calendar, false, false);
Trigger trigger = newTrigger().withIdentity("trigger1", "group1")
.withSchedule(dailyTimeIntervalSchedule().withInterval(1, DAY).onEveryDay()
.withIntervalInHours(1).startingDailyAt(TimeOfDay.hourAndMinuteOfDay(8, 0))
.endingDailyAt(TimeOfDay.hourAndMinuteOfDay(17, 0)).inTimeZone(TimeZone.getTimeZone("GMT+8"))
.onDaysOfTheWeek(SATURDAY, SUNDAY).onCalendar("workdayCalendar").build()).build();
scheduler.scheduleJob(jobDetail, trigger);
总结
Quartz中的表是非常强大和灵活的,它为任务调度带来了极大的便利。在开发中,我们需要根据实际需求,灵活地运用好Quartz的表达式,才能实现有效而高效的任务调度机制。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Quartz所使用的表的说明 - Python技术站