Quartz时间规则表达式
- 格式:doc
- 大小:32.50 KB
- 文档页数:3
Quartz学习--quartz基本介绍和Cron表达式表名称说明qrtz_blob_triggers Trigger作为Blob类型存储(⽤于Quartz⽤户⽤JDBC创建他们⾃⼰定制的Trigger类型,JobStore 并不知道如何存储实例的时候)qrtz_calendars以Blob类型存储Quartz的Calendar⽇历信息, quartz可配置⼀个⽇历来指定⼀个时间范围负责执⾏向QuartzScheduler注册的触发Trigger的⼯作线程ThreadPool :Scheduler使⽤⼀个线程作为任务运⾏的基础设施,任务通过共享线程池中的线程提⾼运⾏效率QuartzSchedulerResources :包含穿件QuartzScheduler实例所需的所有资源(JobStore,ThreadPool等)JobStore :通过类实现的接⼝,这些类要为org.quartz.core.QuartzScheduler的使⽤提供⼀个org.quartz.Job和org.quartz.Trigger存储机制.作业和触发器的存储应该以其名称和组的组合为唯⼀性QuartzScheduler :Quartz的核⼼,他是org.quartz.Scheduler接⼝的间接实现,包含调度org.quartz.Jobs ,注册org.quartz.JobListener实例等的⽅法Scheduler :这是Quartz Scheduler的主要接⼝,代表⼀个独⽴运⾏容器. 调度程序维护JobDetails和触发器的注册表.⼀旦注册,调度程序负责执⾏作业,当她们的相关连的触发器触发(当她们的预定时间到达时 )Trigger:具有所有触发器通⽤属性的基本接⼝,描述了job执⾏的时间触发规则,使⽤TriggerBuilder实例化实际触发器JobDetail :传递给定作业实例的详细信息属性.JobDetails将使⽤JobBuilder创建/定义Job :表⽰要执⾏的"作业"的类的实现接⼝.只有⼀个⽅法:void execute(JobExecutionContext context);(JobExecutionContext 提供调度上下⽂各种信息,运⾏时数据保存在jobDataMap中 )Job 有个⼦接⼝StatefulJob,代表没有状态任务有状态任务不可并发,前次任务没有执⾏完,后⾯任务则⼀直处于阻塞等待状态2. ⼀个job可以被多个Trigger 绑定,但是⼀个Trigger只能绑定⼀个job!7. quartz.properties Quartz可更改配置//调度标识名集群中每⼀个实例都必须使⽤相同的名称(区分特定的调度器实例)org.quartz.scheduler.instanceName:DefaultQuartzScheduler//ID设置为⾃动获取每⼀个必须不同(所有调度器实例中是唯⼀的)org.quartz.scheduler.instanceId :AUTO//数据保存⽅式为持久化org.quartz.jobStore.class :org.quartz.impl.jdbcjobstore.JobStoreTX//表的前缀org.quartz.jobStore.tablePrefix : QRTZ_//设置为TRUE不会出现序列化⾮字符串类到 BLOB 时产⽣的类版本问题//eProperties : true//加⼊集群 true 为集群 false不是集群org.quartz.jobStore.isClustered : false//调度实例失效的检查时间间隔org.quartz.jobStore.clusterCheckinInterval:20000//容许的最⼤作业延长时间org.quartz.jobStore.misfireThreshold :60000//ThreadPool 实现的类名org.quartz.threadPool.class:org.quartz.simpl.SimpleThreadPool//线程数量org.quartz.threadPool.threadCount : 10//线程优先级org.quartz.threadPool.threadPriority : 5(threadPriority 属性的最⼤值是常量 ng.Thread.MAX_PRIORITY,等于10。
Quartz中时间参数说明即Cron表达式Cron表达式Quartz使用类似于Linux下的Cron表达式定义时间规则,Cron表达式由6或7个由空格分隔的时间字段组成,如表1所示:表1 Cron表达式时间字段Cron表达式的时间字段除允许设置数值外,还可使用一些特殊的字符,提供列表、范围、通配符等功能,细说如下:●星号(*):可用在所有字段中,表示对应时间域的每一个时刻,例如,*在分钟字段时,表示“每分钟”;●问号(?):该字符只在日期和星期字段中使用,它通常指定为“无意义的值”,相当于点位符;●减号(-):表达一个范围,如在小时字段中使用“10-12”,则表示从10到12点,即10,11,12;●逗号(,):表达一个列表值,如在星期字段中使用“MON,WED,FRI”,则表示星期一,星期三和星期五;●斜杠(/):x/y表达一个等步长序列,x为起始值,y为增量步长值。
如在分钟字段中使用0/15,则表示为0,15,30和45秒,而5/15在分钟字段中表示5,20,35,50,你也可以使用*/y,它等同于0/y;●L:该字符只在日期和星期字段中使用,代表“Last”的意思,但它在两个字段中意思不同。
L在日期字段中,表示这个月份的最后一天,如一月的31号,非闰年二月的28号;如果L 用在星期中,则表示星期六,等同于7。
但是,如果L出现在星期字段里,而且在前面有一个数值X,则表示“这个月的最后X天”,例如,6L表示该月的最后星期五;●W:该字符只能出现在日期字段里,是对前导日期的修饰,表示离该日期最近的工作日。
例如15W表示离该月15号最近的工作日,如果该月15号是星期六,则匹配14号星期五;如果15日是星期日,则匹配16号星期一;如果15号是星期二,那结果就是15号星期二。
但必须注意关联的匹配日期不能够跨月,如你指定1W,如果1号是星期六,结果匹配的是3号星期一,而非上个月最后的那天。
W字符串只能指定单一日期,而不能指定日期范围;●LW组合:在日期字段可以组合使用LW,它的意思是当月的最后一个工作日;●井号(#):该字符只能在星期字段中使用,表示当月某个工作日。
Cron表达式说明Quartz使用类似于Linux下的Cron表达式定义时间规则,Cron表达式由6或7个由空格分隔的时间字段组成,如表1所示:表1 Cron表达式时间字段Cron表达式的时间字段除允许设置数值外,还可使用一些特殊的字符,提供列表、范围、通配符等功能,细说如下:●星号(*):可用在所有字段中,表示对应时间域的每一个时刻,例如,*在分钟字段时,表示“每分钟”;●问号(?):该字符只在日期和星期字段中使用,它通常指定为“无意义的值”,相当于点位符;●减号(-):表达一个范围,如在小时字段中使用“10-12”,则表示从10到12点,即10,11,12;●逗号(,):表达一个列表值,如在星期字段中使用“MON,WED,FRI”,则表示星期一,星期三和星期五;●斜杠(/):x/y表达一个等步长序列,x为起始值,y为增量步长值。
如在分钟字段中使用0/15,则表示为0,15,30和45秒,而5/15在分钟字段中表示5,20,35,50,你也可以使用*/y,它等同于0/y;●L:该字符只在日期和星期字段中使用,代表“Last”的意思,但它在两个字段中意思不同。
L在日期字段中,表示这个月份的最后一天,如一月的31号,非闰年二月的28号;如果L用在星期中,则表示星期六,等同于7。
但是,如果L出现在星期字段里,而且在前面有一个数值X,则表示“这个月的最后X天”,例如,6L表示该月的最后星期五;●W:该字符只能出现在日期字段里,是对前导日期的修饰,表示离该日期最近的工作日。
例如15W表示离该月15号最近的工作日,如果该月15号是星期六,则匹配14号星期五;如果15日是星期日,则匹配16号星期一;如果15号是星期二,那结果就是15号星期二。
但必须注意关联的匹配日期不能够跨月,如你指定1W,如果1号是星期六,结果匹配的是3号星期一,而非上个月最后的那天。
W字符串只能指定单一日期,而不能指定日期范围;●LW组合:在日期字段可以组合使用LW,它的意思是当月的最后一个工作日;●井号(#):该字符只能在星期字段中使用,表示当月某个工作日。
quartz时间表达式Cron详解cron的表达式被⽤来配置CronTrigger实例。
cron的表达式是字符串,实际上是由七⼦表达式,描述个别细节的时间表。
这些⼦表达式是分开的空⽩,代表:SecondsMinutesHoursDay-of-MonthMonthDay-of-WeekYear (可选字段)例 "0 0 12 ? * WED" 在每星期三下午12:00 执⾏,个别⼦表达式可以包含范围;例如,在前⾯的例⼦⾥("WED")可以替换成 "MON-FRI", "MON, WED, FRI"甚⾄"MON-WED,SAT".“*” 代表整个时间段.每⼀个字段都有⼀套可以指定有效值,如Seconds (秒) :可以⽤数字0-59 表⽰,Minutes(分) :可以⽤数字0-59 表⽰,Hours(时) :可以⽤数字0-23表⽰,Day-of-Month(天) :可以⽤数字1-31 中的任⼀⼀个值,但要注意⼀些特别的⽉份Month(⽉) :可以⽤0-11 或⽤字符串 “JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV and DEC” 表⽰Day-of-Week(每周) :可以⽤数字1-7表⽰(1 =星期⽇)或⽤字符⼝串“SUN, MON, TUE, WED, THU, FRI and SAT”表⽰ “*”:指定所有的值,⽐如,Minutes 设置为 *,表⽰每分钟“/”:为特别单位,表⽰为“每”如“0/15”表⽰每隔15分钟执⾏⼀次,“0”表⽰为从“0”分开始, “3/20”表⽰表⽰每隔20分钟执⾏⼀次,“3”表⽰从第3分钟开始执⾏ “?”:表⽰每⽉的某⼀天,或第周的某⼀天 “L”:⽤于每⽉,或每周,表⽰为每⽉的最后⼀天,或每个⽉的最后星期⼏如“6L”表⽰“每⽉的最后⼀个星期五” “W”:表⽰为最近⼯作⽇,如“15W”放在每⽉(day-of-month)字段上表⽰为“到本⽉15⽇最近的⼯作⽇” “#”:是⽤来指定“的”每⽉第n个⼯作⽇,例在每周(day-of-week)这个字段中内容为"6#3" or "FRI#3" 则表⽰“每⽉第三个星期五”注意: Day-of-Month 和 Day-of-Week不可同时为 *,否则报错:ng.RuntimeException: CronExpression '0/2 * * * * * *' is invalid.at org.quartz.CronScheduleBuilder.cronSchedule(CronScheduleBuilder.java:111)at quartz.QuartzExample.getTrigger(QuartzExample.java:110)at quartz.QuartzExample.run(QuartzExample.java:74)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at ng.reflect.Method.invoke(Method.java:606)at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)at org.junit.runners.ParentRunner.run(ParentRunner.java:363)at org.junit.runner.JUnitCore.run(JUnitCore.java:137)at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:51)at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)Caused by: java.text.ParseException: Support for specifying both a day-of-week AND a day-of-month parameter is not implemented.at org.quartz.CronExpression.buildExpression(CronExpression.java:511)at org.quartz.CronExpression.<init>(CronExpression.java:276)at org.quartz.CronScheduleBuilder.cronSchedule(CronScheduleBuilder.java:107)... 25 moreDisconnected from the target VM, address: '127.0.0.1:61437', transport: 'socket'Process finished with exit code -1CronExpression 源码:protected void buildExpression(String expression) throws ParseException {expressionParsed = true;try {if (seconds == null) {seconds = new TreeSet<Integer>();}if (minutes == null) {minutes = new TreeSet<Integer>();}if (hours == null) {hours = new TreeSet<Integer>();}if (daysOfMonth == null) {daysOfMonth = new TreeSet<Integer>();}if (months == null) {months = new TreeSet<Integer>();}if (daysOfWeek == null) {daysOfWeek = new TreeSet<Integer>();}if (years == null) {years = new TreeSet<Integer>();}int exprOn = SECOND;StringTokenizer exprsTok = new StringTokenizer(expression, " \t",false);while (exprsTok.hasMoreTokens() && exprOn <= YEAR) {String expr = exprsTok.nextToken().trim();// throw an exception if L is used with other days of the monthif(exprOn == DAY_OF_MONTH && expr.indexOf('L') != -1 && expr.length() > 1 && expr.contains(",")) {throw new ParseException("Support for specifying 'L' and 'LW' with other days of the month is not implemented", -1); }// throw an exception if L is used with other days of the weekif(exprOn == DAY_OF_WEEK && expr.indexOf('L') != -1 && expr.length() > 1 && expr.contains(",")) {throw new ParseException("Support for specifying 'L' with other days of the week is not implemented", -1);}if(exprOn == DAY_OF_WEEK && expr.indexOf('#') != -1 && expr.indexOf('#', expr.indexOf('#') +1) != -1) {throw new ParseException("Support for specifying multiple \"nth\" days is not implemented.", -1);}StringTokenizer vTok = new StringTokenizer(expr, ",");while (vTok.hasMoreTokens()) {String v = vTok.nextToken();storeExpressionVals(0, v, exprOn);}exprOn++;}if (exprOn <= DAY_OF_WEEK) {throw new ParseException("Unexpected end of expression.",expression.length());}if (exprOn <= YEAR) {storeExpressionVals(0, "*", YEAR);}TreeSet<Integer> dow = getSet(DAY_OF_WEEK);TreeSet<Integer> dom = getSet(DAY_OF_MONTH);// Copying the logic from the UnsupportedOperationException belowboolean dayOfMSpec = !dom.contains(NO_SPEC);boolean dayOfWSpec = !dow.contains(NO_SPEC);if (!dayOfMSpec || dayOfWSpec) {if (!dayOfWSpec || dayOfMSpec) {throw new ParseException("Support for specifying both a day-of-week AND a day-of-month parameter is not implemented.", 0); }}} catch (ParseException pe) {throw pe;} catch (Exception e) {throw new ParseException("Illegal cron expression format ("+ e.toString() + ")", 0);}}CronExpression 部分代码1)Cron表达式的格式:秒分时⽇⽉周年(可选)。
Quartz表达式解析博客分类:开源框架quartzSUNCC++C#字段允许值允许的特殊字符秒 0-59 , - * /分 0-59 , - * /小时 0-23 , - * /日期 1-31 , - * ? / L W C月份 1-12 或者 JAN-DEC , - * /星期 1-7 或者 SUN-SAT , - * ? / L C #年(可选)留空, 1970-2099 , - * /表达式意义"0 0 12 * * ?" 每天中午12点触发"0 15 10 ? * *" 每天上午10:15触发"0 15 10 * * ?" 每天上午10:15触发"0 15 10 * * ? *" 每天上午10:15触发"0 15 10 * * ? 2005" 2005年的每天上午10:15触发"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发"0 15 10 15 * ?" 每月15日上午10:15触发"0 15 10 L * ?" 每月最后一日的上午10:15触发"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发===================================================================== ==========秒(0~59)分钟(0~59)小时(0~23)天(月)(0~31,但是你需要考虑你月的天数)月(0~11)天(星期)(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)一个完整的例子“0 0 12 ? * WED”表示每个星期三中午12点有些子表达式能包含一些范围或列表例如:子表达式(天(星期))可以为“MON-FRI”,“MON,WED,FRI”,“MON-WED,SAT”“*”字符代表所有可能的值因此,“*”在子表达式(月)里表示每个月的含义,“*”在子表达式(天(星期))表示星期的每一天“/”字符用来指定数值的增量例如:在子表达式(分钟)里的“0/15”表示从第0分钟开始,每15分钟在子表达式(分钟)里的“3/20”表示从第3分钟开始,每20分钟(它和“3,23,43”)的含义一样“?”字符仅被用于天(月)和天(星期)两个子表达式,表示不指定值当2个子表达式其中之一被指定了值以后,为了避免冲突,需要将另一个子表达式的值设为“?”“L”字符仅被用于天(月)和天(星期)两个子表达式,它是单词“last”的缩写但是它在两个子表达式里的含义是不同的。
调度Quartz时间格式配置1、 CronTrigger时间格式配置说明CronTrigger配置格式:格式: [秒] [分] [⼩时] [⽇] [⽉] [周] [年]通配符说明:* :表⽰所有值. 例如:在分的字段上设置 "*",表⽰每⼀分钟都会触发。
:表⽰不指定值。
使⽤的场景为不需要关⼼当前设置这个字段的值。
例如:要在每⽉的10号触发⼀个操作,但不关⼼是周⼏,所以需要周位置的那个字段设置为"?" 具体设置为 0 0 0 10 * ?- :表⽰区间。
例如在⼩时上设置 "10-12",表⽰ 10,11,12点都会触发。
, :表⽰指定多个值,例如在周字段上设置 "MON,WED,FRI" 表⽰周⼀,周三和周五触发/ :⽤于递增触发。
如在秒上⾯设置"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号往后最近的⼯作⽇触发。
quartz定时任务cron表达式详解cron表达式⽤于配置cronTrigger的实例。
cron表达式实际上是由七个⼦表达式组成。
这些表达式之间⽤空格分隔。
1.Seconds (秒)2.Minutes(分)3.Hours(⼩时)4.Day-of-Month (天)5.Month(⽉)6.Day-of-Week (周)7.Year(年)例:"0 0 12 ? * WED” 意思是:每个星期三的中午12点执⾏。
个别⼦表达式可以包含范围或者列表。
例如:上⾯例⼦中的WED可以换成"MON-FRI","MON,WED,FRI",甚⾄"MON-WED,SAT"。
⼦表达式范围:1.Seconds (0~59)2.Minutes (0~59)3.Hours (0~23)4.Day-of-Month (1~31,但是要注意有些⽉份没有31天)5.Month (0~11,或者"JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV,DEC")6.Day-of-Week (1~7,1=SUN 或者"SUN, MON, TUE, WED, THU, FRI, SAT”)7.Year (1970~2099)Cron表达式的格式:秒分时⽇⽉周年(可选)。
字段名允许的值允许的特殊字符秒 0-59 , - * /分 0-59 , - * /⼩时 0-23 , - * /⽇ 1-31 , - * ? / L W C⽉ 1-12 or JAN-DEC , - * /周⼏ 1-7 or SUN-SAT , - * ? / L C #年(可选字段) empty 1970-2099 , - * /字符含义:* :代表所有可能的值。
因此,“*”在Month中表⽰每个⽉,在Day-of-Month中表⽰每天,在Hours表⽰每⼩时- :表⽰指定范围。
时间表达式-----Cron表达式详解序⾔Cron表达式:就是⽤简单的xxoo符号按照⼀定的规则,就能把各种时间维度表达的淋漓尽致,⽆所不在其中,然后在⽤来做任务调度(定时服务)的中所认知执⾏,可想⽽知这是多么的天⾐⽆缝,说是编码艺术凝集⼀点不过分。
⽜逼吹完啦,我就写⼏个简单的cron表达式欣赏下:1、0/20 * * * * ? note:每20秒2、15 0/2 * * * ?note:每⼩时从0分钟开始,每2分钟的第15秒,假如当前时间是20:00:00,那么他的维度就在:20:02:5,20:04:15,20:06:15 ....3、0 0/2 17-21 * * ?note: 每天的下午5点到晚上9点,每隔2分中的第00秒,假如当前时间是20:24:52 ,那么他的时间维度在:20:26:00,20:28:00,20:30:00 ...看到Cron表达式的简洁与强⼤并存,忍不住往下深⼊,GoCron表达式的符号、格式表格表1、cron表达式特殊字符意义⽰意表特殊字符意义*匹配所有的值。
如:*在分钟的字段域⾥表⽰每分钟只在⽇期域和星期域中使⽤。
它被⽤来指定“⾮明确的值”-指定⼀个范围。
如:“10-12”在⼩时域意味着“10点、11点、12点”,指定⼏个可选值。
如:“MON,WED,FRI”在星期域⾥表⽰“星期⼀、星期三、星期五”/指定增量。
如:“0/15”在秒域意思是没分钟的0,15,30和45秒。
“5/15”在分钟域表⽰没⼩时的5,20,35和50。
符号“*”在“/”前⾯(如:*/10)等价于0在“/”前⾯(如:0/10)L表⽰day-of-month和day-of-week域,但在两个字段中的意思不同,例如day-of-month域中表⽰⼀个⽉的最后⼀天。
如果在day-of-week域表⽰‘7’或者‘SAT’,如果在day-of-week域中前⾯加上数字,它表⽰⼀个⽉的最后⼏天,例如‘6L’就表⽰⼀个⽉的最后⼀个星期五W只允许⽇期域出现。
quartz 时间表达式
Quartz时间表达式是一种用于定义任务调度计划的格式。
它基于CRON表达式,并添加了一些额外的功能。
Quartz时间表达式的格式如下:
{秒数} {分钟} {小时} {日期} {月份} {星期} [{年份}]
其中,方括号中的年份可选,在未指定时表示任务在每一年都会执行。
以下是Quartz时间表达式的一些示例:
- "0 0 12 * * ?" 表示每天中午12点执行任务。
- "0 0/5 * * * ?" 表示每5分钟执行一次任务。
- "0 15 10 ? * MON-FRI" 表示每周一至周五的上午10点15分执行任务。
- "0 0 12 ? * 6L" 表示每月最后一个星期五的中午12点执行任务。
在Quartz时间表达式中,还可以使用一些特殊字符,如:
- *(星号):匹配任意值。
- ?(问号):表示不确定的值,通常用于日期或星期的字段中。
- -(短横线):表示范围。
- ,(逗号):表示多个值。
- /(斜杠):表示步进值。
使用这些特殊字符可以更灵活地定义任务的调度计划。
1. 什么是quartzmanager表达式quartzmanager表达式是用来定义quartz调度器中任务调度的时间规则的一种表达式。
它由7个部分组成,分别表示秒、分、时、日期、月份、星期和年。
2. quartzmanager表达式的语法quartzmanager表达式的语法非常简单,在每个部分中用空格或者逗号隔开不同的时间点或者时间范围,用“*”表示任意时间,用“?”表示不指定。
比如:- “0 0 12 * * ?”表示每天12点触发任务- “0 15 10 ? * MON-FRI”表示周一至周五每天10点15分触发任务- “0 0 12 * 3#2 ?”表示每个月第二个星期三12点触发任务3. quartzmanager表达式的应用场景quartzmanager表达式广泛应用于各种定时任务的调度,比如定时发送邮件、定时执行数据同步、定时生成报表等。
它灵活、强大,可以满足各种复杂的调度需求。
4. quartzmanager表达式的高级用法quartzmanager表达式还支持一些高级的用法,比如:- “L”表示最后一天,比如“0 0 12 L * ?”表示每个月最后一天12点触发任务- “W”表示工作日,比如“0 15 10 * * ?”表示每个月最后一个工作日10点15分触发任务- “#”表示第几个星期几,比如“0 0 12 * 3#2 ?”表示每个月第二个星期三12点触发任务5. quartzmanager表达式的注意事项在使用quartzmanager表达式时需要注意以下几点:- quartzmanager表达式不支持年份以前的时间点- quartzmanager表达式的最小时间单位为秒- quartzmanager表达式的日期和星期两个部分不能同时为“*”- quartzmanager表达式的时间范围不能跨月或者年- quartzmanager表达式不支持无限重复执行6. 总结quartzmanager表达式作为quartz调度器中任务调度的时间规则,是实现定时任务调度的核心。
Quartz表达式
“*”字符代表所有可能的值
因此,“*”在子表达式(月)里表示每个月的含义,“*”在子表达式(天(星期))表示星期的每一天
“/”字符用来指定数值的增量
例如:在子表达式(分钟)里的“0/15”表示从第0分钟开始,每15分钟
在子表达式(分钟)里的“3/20”表示从第3分钟开始,每20分钟(它和“3,23,43”)的含义一样“?”字符仅被用于天(月)和天(星期)两个子表达式,表示不指定值
当2个子表达式其中之一被指定了值以后,为了避免冲突,需要将另一个子表达式的值设为“?”
“L”字符仅被用于天(月)和天(星期)两个子表达式,它是单词“last”的缩写但是它在两个子表达式里的含义是不同的。
在天(月)子表达式中,“L”表示一个月的最后一天
在天(星期)自表达式中,“L”表示一个星期的最后一天,也就是SAT
如果在“L”前有具体的内容,它就具有其他的含义了
例如:“6L”表示这个月的倒数第6天,“FRIL”表示这个月的最一个星期五
注意:在使用“L”参数时,不要指定列表或范围,因为这会导致问题
字段允许值允许的特殊字符
秒 0-59 , - * /
分 0-59 , - * /
小时 0-23 , - * /
日期 1-31 , - * ? / L W C
月份 1-12 或者 JAN-DEC , - * /
星期 1-7 或者 SUN-SAT , - * ? / L C #
年(可选)留空, 1970-2099 , - * /
表达式意义
"0 0 12 * * ?" 每天中午12点触发
"0 15 10 ? * *" 每天上午10:15触发
"0 15 10 * * ?" 每天上午10:15触发
"0 15 10 * * ? *" 每天上午10:15触发
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发
"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发
"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发
"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发
"0 15 10 15 * ?" 每月15日上午10:15触发
"0 15 10 L * ?" 每月最后一日的上午10:15触发
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发
================================================================ ===============
秒(0~59)
分钟(0~59)
小时(0~23)
天(月)(0~31,但是你需要考虑你月的天数)
月(0~11)
天(星期)(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)
一个完整的例子
“0 0 12 ? * WED”表示每个星期三中午12点
有些子表达式能包含一些范围或列表
例如:子表达式(天(星期))可以为“MON-FRI”,“MON,WED,FRI”,“MON-WED,SAT”。