Quartz cron表达式分析 (版本2.1.7)

来源:互联网 发布:网络变压器加工 编辑:程序博客网 时间:2024/05/18 17:44


Cron表达式是以5个或者6个空格隔开,分成6个或7个域,每个域代表一个时间域。Cron表达式有以下两种语法格式:

1.     Seconds Minutes Hours DayofMonth Month DayofWeek Year

2.     Seconds Minutes Hours DayofMonth Month DayofWeek

Month取值:

1.     一月:JAN或0

2.     二月:FEB或1

3.     三月:MAR或2

4.     四月:APR或3

5.     五月:MAY或4

6.     六月:JUN或5

7.     七月:JUL或6

8.     八月:AUG或7

9.     九月:SEP或8

10.   十月:OCT或9

11.   十一月:NOV或10

12.   十二月:DEC或11

DayofMonth取值:

1.     数字

2.     表示最后:L

3.     有效工作日(周一至周五):W     (系统将在离指定日期最近的有效工作日执行。比如5W,如果5日是工作日,则在当天触发;如果5日是周六,则会延期在周一触发。注意:W不会跨月。比如30W30号是周六,则不会顺延至下周一来执行

DayofWeek取值:

1.     周日:SUN或1

2.     周一:MON或2

3.     周二:TUE或3

4.     周三:WED或4

5.     周四:THU或5

6.     周五:FRI或6

7.     周六:SAT或7

8.     表示最后:L

域中符号解释:

1.     * :表示匹配任意值。比如在Seconds域中配置为*,则表示每秒执行。(可用于任意域)

2.     ?:只能用在 DayofMonth和DayofWeek,表示匹配该域的任意值。

3.     -:表示范围。例如:在Seconds域中配置2-10,则表示从2到10秒内,每秒执行。

4.     /:表示从起始开始触发,然后每个固定时间执行一次。比如在Seconds域中配置5/20,则表示在第5秒开始执行,然后每过20秒执行一次(以每一分钟为周期)。

5.     ,:表示枚举值。例如在Seconds域中配置5,20,25,则表示在第5秒、20秒和25秒执行。

6.     L:只能用在 DayofMonth和DayofWeek,表示每周或者每月的最后一天。如果DayofWeek域配置5L则表示最后一个星期的周四执行。

7.     W:只能用在DayofMonth域,

 

//初始化带cron表达式的调度器:SchedulerFactory sf =new StdSchedulerFactory();  Scheduler scheduler = sf.getScheduler();     //指定调度器执行的类    JobDetail job = newJob(HelloJob.class)     .withIdentity("job1","group1")     .build();     //创建一个cron表达式的触发器   CronTrigger trigger = newTrigger()         .withIdentity("trigger1", "group1")//       .withSchedule(cronSchedule("1,2,3,40,50 * * * * ?"))  //每分钟的第1,2,3,40,50秒执行//       .withSchedule(cronSchedule("1-30 * * * * ?"))  // 在1-30中的每秒执行//       .withSchedule(cronSchedule("* * * * * ?"))  // 每秒执行//       .withSchedule(cronSchedule("5/20 * * * * ?"))  // 从第5秒开始执行后,每过20秒执行一次(一分钟内)。分别在5,25,45秒执行//       .withSchedule(cronSchedule("50 19 * * * ?"))  // 每个小时的第19分钟50秒执行//       .withSchedule(cronSchedule("0 0/10 * * * ?"))  // 每10分钟执行一次//       .withSchedule(cronSchedule("0 30 0/1 * * ?"))  // 每小时的第30分钟执行//       .withSchedule(cronSchedule("0 38 15 * * ?"))  // 每日的15:38分钟执行//       .withSchedule(cronSchedule("0 45 15 ? * MON-FRI"))  // 每周周一至周五的15:45分执行//       .withSchedule(cronSchedule("0 47 15 ? * FRI"))  // 每周五的15:47分执行//       .withSchedule(cronSchedule("0 50 15 ? * 6,7"))  // 每周的周五和周六的15:47分执行//       .withSchedule(cronSchedule("0 31 16 6 6 ? *"))  //每年的6月6号的16:31分执行//       .withSchedule(cronSchedule("0 33 16 6 * ?"))  //每月的6号16:33分执行//       .withSchedule(cronSchedule("0 33 16 6 1,8 ?"))  //每年第1月、8月 6号16:33执行         .withSchedule(cronSchedule("0 35 16 8 1 ?"))  //每年第1月8号16:35执行         .build();//将执行类与触发器设置进定时器中        scheduler.scheduleJob(job,trigger);        //启动定时器        scheduler.start();

"1 * * * *?" //表示每分钟的第1秒执行"1,2,3,40,50 * ** * ?" //表示每分钟的第1、2、3、40、50秒执行"1-30 * * * *?" //在1-30中每秒执行"* * * * *?" //每秒循环"5/20 * * * *?"  // 从第5秒开始执行后,每过20秒执行一次(一分钟内)。分别在5,25,45秒执行"50 19 * * *?" //每个小时的19分50秒执行"0 0/10 * * *?" // 每10分钟执行一次"0 30 0/1 * *?" // 每小时的第30分钟执行"0 38 15 * *?"  // 每日的15:38分钟执行"0 45 15 ? *MON-FRI" // 每周周一至周五的15:45分钟执行。注意:此时的DayofMonth域必须为?"0 50 15 ? *6,7" // 每周的周五和周六的15:47分执行"0 31 16 6 6 ?*"   //每年的6月6号的16:31分执行"0 33 16 6 *?" //每月的6号16:33分执行"0 33 16 6 1,8?" //每年第1月、8月 6号16:33执行