quartz定时格式配置
- 格式:rtf
- 大小:72.38 KB
- 文档页数:2
使用SpringQuartz执行定时任务的表达式使用Spring Quartz执行定时任务的表达式附:cronExpression配置说明一个Cron-表达式是一个由六至七个字段组成由空格分隔的字符串,其中6个字段是必须的而一个是可选的,如下:字段名允许的值允许的特殊字符字段允许值允许的特殊字符秒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触发。
⽤Quartz处理定时执⾏的任务这次做的项⽬中,有⼀部分功能需要实现定时执⾏。
呃,这样说可能有点笼统,打个⽐⽅吧。
例如⽤户在登录的时候,连续输错3次密码后,系统会将该⽤户冻结,不再允许该⽤户登录系统,等到了晚上零晨时分,再为所有被冻结的⽤户解冻,这样,⽤户在第⼆天⼜可以正常登录系统了。
这样做是为了⽤户帐号安全,可有效防⽌暴⼒破解密码。
呃,好像跑题了,咱还是回到正题来。
在这⾥我们只关⼼怎么能实现每天晚上零晨准时执⾏为⽤户解冻的程序。
第⼀时间,我想到了JDK⾃带的Timer和TimerTask类,可经过测试,要想做到精准的定时,还是⽐较困难的。
于是另寻其它解决⽅案,就找到了Quartz,⾄于Quartz是什么,我想百度会告诉⼤家的。
⼆话不说,下载了Quartz包,下载的是官⽅最新版2.1.7。
然后兴致勃勃的百度起来,关于Quartz的⽤法,⽂章还是挺多的,但是,Copy进来后,总是报错。
⽆奈,最新版的⽤法,⽹上⼜很难找到。
怎么办呢?⾃⼰E⽂⼜不好!哎,E⽂是我永远的痛啊,谁叫俺爱国呢。
翻了⼀下下载的Quartz包,发现⾥⾯有好多例⼦,然后挨个挨个跑例⼦。
哈,功夫不负有⼼⼈啊,第三个例⼦刚好能解决我现在的问题,再仔细推敲⼀下,发现Quartz原来如此好⽤。
为了⽅便⽇后重复利⽤,也为了其他没⽤过Quartz⽽且E⽂也不怎么好的朋友不再受折磨,就决定把这次的使⽤⼼德记录下来。
第⼀步:引包 要使⽤Quartz,必须要引⼊以下这⼏个包: 1、log4j-1.2.16 2、quartz-2.1.7 3、slf4j-api-1.6.1.jar 4、slf4j-log4j12-1.6.1.jar 这些包都在下载的Quartz包⾥⾯包含着,因此没有必要为寻找这⼏个包⽽头疼。
第⼆步:创建要被定执⾏的任务类 这⼀步也很简单,只需要创建⼀个实现了org.quartz.Job接⼝的类,并实现这个接⼝的唯⼀⼀个⽅法execute(JobExecutionContext arg0) throws JobExecutionException即可。
quartz的cron表达式Quartz的Cron表达式简介1. 什么是Cron表达式Cron表达式是一种用于定时任务调度的标准格式。
在Quartz框架中,Cron表达式被广泛使用,用于设置任务的执行时间。
2. Cron表达式的语法Cron表达式由6个或7个字段组成,每个字段代表时间的一个维度。
这6个或7个字段分别是:•秒(0~59)•分钟(0~59)•小时(0~23)•日(1~31)•月(1~12)•周几(0~7,0和7都代表周日)可以使用通配符或范围来表示时间的不确定性。
例如,“*“代表所有可能的值,”?“在日和周几字段中代表不指定值,”-“用来表示范围,” / “用来表示递增间隔。
例如,要设置每天早上9点执行任务,Cron表达式可以是0 0 9 ? * *。
3. 常用的Cron表达式示例以下是一些常见的Cron表达式示例:•0 0/5 * * * ?表示每隔5分钟执行一次任务。
•0 0 12 * * ?表示每天中午12点执行任务。
•0 0 8 ? * MON-FRI表示周一到周五每天早上8点执行任务。
•0 0 8 ? * 6L表示每个月的最后一个周五早上8点执行任务。
4. Cron表达式的高级用法Cron表达式还支持一些高级功能,例如使用”#“指定月份中的第几个周几,使用”L”指定月份中的最后一天,使用”W”指定平日最近的工作日等等。
以下是一些高级用法的示例:•0 0 12 ? JAN,FEB,DEC *表示一月、二月和十二月每天中午12点执行任务。
•0 0/30 9-17 * * MON-FRI#2表示周一到周五上午9点到下午5点之间,每隔30分钟执行一次任务,并且每个月的第二个周一符合条件。
5. 总结Cron表达式是Quartz框架中用于指定任务执行时间的标准格式。
它非常灵活,并且支持多种时间维度的设置。
掌握Cron表达式的语法和常用示例,可以帮助我们轻松实现定时任务的调度。
6. Cron表达式的注意事项在使用Cron表达式时,需要注意以下几点:•时间表达式字段之间使用空格分隔。
Quartz中时间表达式的设置-----corn表达式时间格式: <!-- s m h d m w(?) y(?) -->, 分别对应: 秒>分>小时>日>月>周>年, 举例:1.每天什么时候执行:<value>0 59 23 * * ?</value>: 如下为每天23:59:00开始执行<value>0 1,2,3 11,12 * * ? </value>: 每天11:01,11:02,11:03;12:01,12:02,12:03分执行任务2.每隔多久执行:汇总说明: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;==================================================Quartz cron 表达式的格式十分类似于UNIX cron 格式,但还是有少许明显的区别。
区别之一就是Quartz 的格式向下支持到秒级别的计划,而UNIX cron 计划仅支持至分钟级。
许多我们的触发计划要基于秒级递增的(例如,每45秒),因此这是一个非常好的差异。
Spring+Quartz实现定时任务的配置方法第一步:.导入相关的jar包(1)spring.jar(2)quartz-1.6.0.jar(3)相关包commons-collections-3.2.jar ; commons-logging-1.1.1.jar; log4j-1.2.16.jar第二步:创建一个类来定义工作定义Quartz工作的第一步是创建一个类来定义工作。
要做到这一点,你需要从Spring 的QuartzJobBean中派生子类。
第三步:配置JobDetail值得注意的是,在这里你并没有直接声明一个TopTenTask Bean,而是声明了一个JobDetailBean。
这是使用Quartz时的一个特点。
JobDetailBean是Quartz的org.quartz.JobDetail的子类,它要求通过jobClass属性来设置一个Job对象。
使用Quartz的JobDetail中的另一个特别之处是TopTenTask的timeout属性是间接设置的。
JobDetail的jobDataAsMap属性接受一个java.util.Map,其中包含了需要设置给jobClass的各种属性。
在这里,这个map包含了一个键值为timeout。
当JobDetailBean实例化时,它会将5注入到EmailReportJob的timeout属性中。
第四步:配置Trigger工作已经被定义好了,接下来你需要调度这个工作。
Quartz的org.quartz.Trigger类描述了何时及以怎样的频度运行一个Quartz工作。
Spring提供了两个触发器,SimpleTriggerBean和CronTriggerBean。
SimpleTriggerBean与ScheduledTimerTask类似。
你可以用它来指定一个工作应该以怎样的频度运行,以及(可选地)在第一次运行工作之前应该等待多久。
例如,要调度报表工作每24小时运行一次,第一次在1小时之后开始运行,可以按照以下方式进行声明:<bean id="topTenTrigger"class="org.springframework.scheduling.quartz.SimpleTriggerBean"><property name="jobDetail"><ref bean="topTenTask"/></property><property name="startDelay"><value>3600000</value></property><property name="repeatInterval"><value>86400000</value></property></bean>属性jobDetail装配了将要被调度的工作,在这个例子中是topTenTask Bean。
quartz2.3.0(⼗)xml配置⽅式定义quartz定时任务1、新增pom依赖除了按照《》添加依赖之外,pom.xml⾥新增加依赖:<dependency><groupId>opensymphony</groupId><artifactId>quartz-all</artifactId><version>1.6.3</version></dependency><dependency><groupId>javax.transaction</groupId><artifactId>jta</artifactId><version>1.1</version></dependency>2、quartz.properties配置#============================================================================# Configure Main Scheduler Properties#============================================================================org.quartz.scheduler.instanceName: TestSchedulerorg.quartz.scheduler.instanceId: AUTO#============================================================================# Configure ThreadPool#============================================================================org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPoolorg.quartz.threadPool.threadCount: 3org.quartz.threadPool.threadPriority: 5#============================================================================# Configure JobStore#============================================================================org.quartz.jobStore.misfireThreshold: 60000org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore#============================================================================# Configure Plugins#============================================================================org.quartz.plugin.triggHistory.class: org.quartz.plugins.history.LoggingJobHistoryPluginorg.quartz.plugin.jobInitializer.class: org.quartz.plugins.xml.XMLSchedulingDataProcessorPluginorg.quartz.plugin.jobInitializer.fileNames: quartz_data.xmlorg.quartz.plugin.jobInitializer.failOnFileNotFound: trueorg.quartz.plugin.jobInitializer.scanInterval: 120org.quartz.plugin.jobInitializer.wrapInUserTransaction: false3、quartz_data.xml配置<?xml version="1.0" encoding="UTF-8"?><job-scheduling-data xmlns="/xml/JobSchedulingData"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/JobSchedulingData /xml/job_scheduling_data_1_8.xsd" version="1.8"><pre-processing-commands><delete-jobs-in-group>*</delete-jobs-in-group><!-- 清除调度器中的所有作业 --><delete-triggers-in-group>*</delete-triggers-in-group><!-- 清除调度器中的所有触发器 --></pre-processing-commands><processing-directives><!-- 如果调度程序中有任何同名的作业/触发器(与此⽂件中相同),会覆盖它们 --><overwrite-existing-data>true</overwrite-existing-data><!-- 如果调度程序中有任何同名的作业/触发器(与此⽂件中相同),并且覆盖为false,则忽略它们,⽽不是⽣成错误 --><ignore-duplicates>false</ignore-duplicates></processing-directives><schedule><job><name>TestJob1</name><job-class>org.quartz.examples.example10.SimpleJob</job-class></job><job><name>TestDurableJob</name><job-class>org.quartz.examples.example10.SimpleJob</job-class><durability>true</durability><recover>false</recover></job><trigger><simple><name>TestSimpleTrigger1AtFiveSecondInterval</name><job-name>TestJob1</job-name><repeat-count>-1</repeat-count><!-- repeat indefinitely --><repeat-interval>5000</repeat-interval><!-- every 5 seconds --></simple></trigger><job><name>TestJob2</name><group>GroupOfTestJob2</group><description>This is the description of TestJob2</description><job-class>org.quartz.examples.example10.SimpleJob</job-class><durability>false</durability><recover>true</recover><job-data-map><entry><key>someKey</key><value>someValue</value></entry><entry><key>someOtherKey</key><value>someOtherValue</value></entry></job-data-map></job><trigger><simple><name>TestSimpleTrigger2AtTenSecondIntervalAndFiveRepeats</name><group>GroupOfTestJob2Triggers</group><job-name>TestJob2</job-name><job-group>GroupOfTestJob2</job-group><start-time>2010-02-09T10:15:00</start-time><misfire-instruction>MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT</misfire-instruction> <repeat-count>5</repeat-count><repeat-interval>10000</repeat-interval></simple></trigger><trigger><cron><name>TestCronTrigger2AtEveryMinute</name><group>GroupOfTestJob2Triggers</group><job-name>TestJob2</job-name><job-group>GroupOfTestJob2</job-group><job-data-map><entry><key>someKey</key><value>overriddenValue</value></entry><entry><key>someOtherKey</key><value>someOtherOverriddenValue</value></entry></job-data-map><cron-expression>0 * * ? * *</cron-expression></cron></trigger><trigger><cron><name>TestCronTrigger2AtEveryMinuteOnThe45thSecond</name><group>GroupOfTestJob2Triggers</group><job-name>TestJob2</job-name><job-group>GroupOfTestJob2</job-group><start-time>2010-02-09T12:26:00.0</start-time><end-time>2012-02-09T12:26:00.0</end-time><misfire-instruction>MISFIRE_INSTRUCTION_SMART_POLICY</misfire-instruction><cron-expression>45 * * ? * *</cron-expression><time-zone>America/Los_Angeles</time-zone></cron></trigger></schedule></job-scheduling-data>4、任务类,xml配置⽂件⾥指向的job任务类package org.quartz.examples.example10;import java.util.Date;import java.util.Set;import org.quartz.Job;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import org.quartz.JobKey;import org.slf4j.Logger;import org.slf4j.LoggerFactory;/*** job任务类*/public class SimpleJob implements Job {private static Logger LOG = LoggerFactory.getLogger(SimpleJob.class);// 必须要有public修饰的⽆参构造函数public SimpleJob() {}// 定时器执⾏⽅法@SuppressWarnings("unchecked")public void execute(JobExecutionContext context) throws JobExecutionException {JobKey jobKey = context.getJobDetail().getKey();("--------- job任务执⾏: " + jobKey + " executing at " + new Date() + ", fired by: "+ context.getTrigger().getKey());if (context.getMergedJobDataMap().size() > 0) {Set<String> keys = context.getMergedJobDataMap().keySet();for (String key : keys) {String val = context.getMergedJobDataMap().getString(key);("--------- job任务执⾏。
quart 定时规则
Quartz定时规则的语法是一种基于cron的表达式,它允许你定义在特定时间执行的计划任务。
以下是Quartz定时规则的一些常见符号和用法:
1. 秒(0-59)
2. 分(0-59)
3. 小时(0-23)
4. 日期(1-31)
5. 月份(1-12 或 JAN-DEC)
6. 星期(0-7 或 SUN-SAT,其中0和7都表示SAT)
你可以使用这些字段来定义任务的执行时间。
例如:
"0 0 12 ?" 表示每天中午12点执行任务。
"0 15 10 ? MON-FRI" 表示每周一到周五的上午10点15分执行任务。
"0 0/15 9-17 ?" 表示在每天的上午9点到下午5点之间,每小时执行一次任务。
"0 0 9 1/15 ?" 表示每月的1号、15号的上午9点执行任务。
"0 0 12 1/2 ?" 表示每两个月的1号中午12点执行任务。
"0 0 0 25 12 ?" 表示每年的12月25日午夜执行任务。
这只是Quartz定时规则的一些基本示例,你可以根据自己的需求来定义更
复杂的表达式。
请注意,Quartz定时规则的具体语法可能因不同的编程语
言或框架而有所差异,因此建议查阅相关语言的文档以获得准确的语法规范。
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表⽰每⼩时- :表⽰指定范围。
quartz实现定时功能实例详解(servlet定时器配置⽅法)复制代码代码如下:public class TestJob implements Job{public TestJob(){}public void execute(JobExecutionContext arg0) throws JobExecutionException{String name = context.getJobDetail().getJobDataMap().getString("name");System.out.println("job executing..."+name); }}public class QuartzTest{public static void main(String[] args){QuartzTest test = new QuartzTest();try{test.startSchedule();}catch (Exception e){e.printStackTrace();}}public void startSchedule() throws Exception{Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();JobDetail jobDetail =new JobDetail("testJob", Scheduler.DEFAULT_GROUP, TestJob.class);//结束时间long end = System.currentTimeMillis() + 9000L;//执⾏10次,每3秒执⾏⼀次,到9秒后结束SimpleTrigger trigger = new SimpleTrigger("test",null,new Date(),new Date(end),10,3000L);scheduler.scheduleJob(jobDetail, trigger);scheduler.start();}}执⾏上⾯这个类基本实现了⼀个简单的定时程序。
一个Cron-表达式是一个由六至七个字段组成由空格分隔的字符串,其中6个字段是必须的而一个是可选的,如下:
--------------------------------------------------------------------------------
字段名允许的值允许的特殊字符
--------------------------------------------------------------------------------
秒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 , - * /
--------------------------------------------------------------------------------
写时从左到右分别表示秒分时日月周年
'*' 字符可以用于所有字段,在“分”字段中设为"*"表示"每一分钟"的含义。
'?' 字符可以用在“日”和“周几”字段. 它用来指定'不明确的值'. 这在你需要指定这两个字段中的某一个值而不是另外一个的时候会被用到。
在后面的例子中可以看到其含义。
'-' 字符被用来指定一个值的范围,比如在“小时”字段中设为"10-12"表示"10点到12点".
',' 字符指定数个值。
比如在“周几”字段中设为"MON,WED,FRI"表示"the days Monday, Wednesday, and Friday".
'/' 字符用来指定一个值的的增加幅度. 比如在“秒”字段中设置为"0/15"表示"第0, 15, 30, 和45秒"。
而"5/15"则表示"第5, 20, 35, 和50". 在'/'前加"*"字符相当于指定从0秒开始.每个字段都有一系列可以开始或结束的数值。
对于“秒”和“分”字段来说,其数值范围为0到59,对于“小时”字段来说其为0到23, 对于“日”字段来说为0到31, 而对于“月”字段来说为1到12。
"/"字段仅仅只是帮助你在允许的数值范围内从开始"第n"的值。
因此对于“月”字段来说"7/6"只是表示7月被开启而不是“每六个月”, 请注意其中微妙的差别。
'L'字符可用在“日”和“周几”这两个字段。
它是"last"的缩写, 但是在这两个字段中有不同的含义。
例如,“日”字段中的"L"表示"一个月中的最后一天" ——对于一月就是31号对于二月来说就是28号(非闰年)。
而在“周几”字段中, 它简单的表示"7" or "SAT",但是如果在“周几”字段中使用时跟在某个数字之后, 它表示"该月最后一个星期×" ——比如"6L"表示"该月最后一个周五"。
当使用'L'选项时,指定确定的列表或者范围非常重要,否则你会被结果搞糊涂的。
'W'字符可用于“日”字段。
用来指定离给定日期最近的工作日(周一到周五)。
比如你将“日”字段设为"15W",意为: "离该月15号最近的工作日"。
因此如果15号为周六,触发器会在14号即周五调用。
如果15号为周日, 触发器会在16号也就是周一触发。
如果15号为周二,那么当天就会触发。
然而如果你将“日”字段设为"1W", 而一号又是周六, 触发器会于下周一也就是当月的3号触发,因为它不会越过当月的值的范围边界。
'W'字符只能用于“日”字段的值为单独的一天而不是一系列值的时候。
'L'和'W'可以组合用于“日”字段表示为'LW',意为"该月最后一个工作日"。
'#' 字符可用于“周几”字段。
该字符表示“该月第几个周×”,比如"6#3"表示该月第三个周五( 6表示周五而"#3"该月第三个)。
再比如: "2#1" = 表示该月第一个周一而"4#5" = 该月第五个周三。
注意如果你指定"#5"该月没有第五个“周×”,该月是不会触发的。
'C' 字符可用于“日”和“周几”字段,它是"calendar"的缩写。
它表示为基于相关的日历所计算出的值(如果有的话)。
如果没有关联的日历, 那它等同于包含全部日历。
“日”字段值为"5C"表示"日历中的第一天或者5号以后",“周几”字段值为"1C"则表示"日历中的第一天或者周日以后"。
对于“月份”字段和“周几”字段来说合法的字符都不是大小写敏感的。
下面是一些完整的例子:
------------------------------------------------------------------------------------------
表达式含义
------------------------------------------------------------------------------------------
"0 0 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分每分钟一次触发
"0 0/5 14 * * ?" 每天从下午2点开始到2:55分结束每5分钟一次触发
"0 0/5 14,18 * * ?" 每天的下午2点至2:55和6点至6点55分两个时间段内每5分钟一次触发"0 0-5 14 * * ?" 每天14:00至14:05每分钟一次触发
"0 10,44 14 ? 3 WED" 三月的每周三的14:10和14: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" 每月最后一个周五的10:15触发
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月最后一个周五的10:15触发
"0 15 10 ? * 6#3" 每月的第三个周五的10:15触发
------------------------------------------------------------------------------------------
文章出处:/course/3_program/java/javajs/2008530/118163.html。