cron表达式

  1. 一个cron表达式有至少6个(也可能是7个)由空格分隔的时间元素。从左至右,这些元素的定义如下:  
  2.   
  3. 1.秒(0–59)  
  4.   
  5. 2.分钟(0–59)  
  6.   
  7. 3.小时(0–23)  
  8.   
  9. 4.月份中的日期(1–31)  
  10.   
  11. 5.月份(1–12或JAN–DEC)  
  12.   
  13. 6.星期中的日期(1–7或SUN–SAT)  
  14.   
  15. 7.年份(1970–2099)  
  16.   
  17. 每一个元素都可以显式地规定一个值(如6),一个区间(如9-12),  
  18. 一个列表(如9,11,13)或一个通配符(如*)。“月份中的日期”和“星期中的日期”  
  19. 这两个元素是互斥的,因此应该通过设置一个问号(?)来表明你不想设置的那个字段。  
  20. 下表中显示了一些cron表达式的例子和它们的意义:  
  21.   
  22.   
  23.  表  达  式  意    义   
  24.  0 0 10,14,16 * * ?  每天上午10点,下午2点和下午4点   
  25.  0 0,15,30,45 * 1-10 * ?  每月前10天每隔15分钟   
  26.  30 0 0 1 1 ? 2012  在2012年1月1日午夜过30秒时   
  27.  0 0 8-5 ? * MON-FRI  每个工作日的工作时间   
  28.      
  29.   
  30. 对于cronReportTrigger,我们设置cronExpression为0 0 6 * * ?可以把它读作  
  31. “在任何月份任何日期(不管是星期几)的6时0分0秒执行触发器。”换句话说,  
  32. 这个触发器会在每天早晨6:00执行。  
  33.   
  34. 使用CronTriggerBean完全能够满足课程主任的期望了。现在剩下要做的只是启动这个工作了。  
  35.   
  36.    
  37.   
  38. Quartz中CronTrigger介绍  
  39.   
  40. Quartz中CronTrigger的expression:"Cron-Expression"  
  41. "Cron-Expression"与linux中的crontab有很大的不同,昨天差点迷惑了我。  
  42.   
  43. "Cron-Expression"由6到7个用空格分开的字段组成的表达式这6或7个字段必须遵循下面的顺  
  44. 序和格式:  
  45.   
  46. Field Name   Allowed Values   Allowed Special Characters  
  47. Seconds    0-59    , - * /  
  48. Minutes    0-59    , - * /  
  49. Hours    0-23    , - * /  
  50. Day-of-month    1-31    , - * ? / L W C  
  51. Month    1-12 or JAN-DEC    , - * /  
  52. Day-of-Week    1-7 or SUN-SAT    , - * ? / L C #  
  53. Year (Optional)    empty, 1970-2099    , - * /  
  54.   
  55. *是一个通配符,表示任何值,用在Minutes字段中表示每分钟。  
  56. ?只可以用在day-of-month或者Day-of-Week字段中,用来表示不指定特殊的值。  
  57. -用来表示一个范围,比如10-12用在Month中表示10到12月。  
  58. ,用来表示附加的值,比如MON,WED,FRI在day-of-week字段中表示礼拜一和礼拜三和礼拜五。  
  59. /用来表示增量,比如0/15用在Minutes字段中表示从0分开始0和15和30和45分。  
  60. L只可以用在day-of-month或者Day-of-Week字段中,如果用在Day-of-month中,表示某个月  
  61. 的最后一天,1月则是表示31号,2月则表示28号(非闰年),如果用在Day-of-Week中表示礼  
  62. 拜六(数字7);但是如果L与数字组合在一起用在Day-of-month中,比如6L,则表示某个月  
  63. 的最后一个礼拜六;  
  64. C  
  65. W  
  66. #  
  67.    
  68. 0 1 0 1 1-12 ?表示每月1号0点1分执行。  
  69. 0 0 21 ? * 1表示每个礼拜天21点0分执行。  
  70. 0 0 0 * * ?表示每天0点0分执行。  
  71. 0 * 22 * * ?表示每天22点开始每分钟  
  72. 0 * 0-23 * * ?表示每天每分钟  

 

[html]  view plain  copy
  1. Quartz cron 表达式的格式十分类似于 UNIX cron 格式,但还是有少许明显的区别。区别之一就是 Quartz 的格式向下支持到秒级别的计划,而 UNIX cron 计划仅支持至分钟级。许多我们的触发计划要基于秒级递增的(例如,每45秒),因此这是一个非常好的差异。  
  2.   
  3. 在 UNIX cron 里,要执行的作业(或者说命令)是存放在 cron 表达式中的,在第六个域位置上。Quartz 用 cron 表达式存放执行计划。引用了 cron 表达式的 CronTrigger 在计划的时间里会与 job 关联上。  
  4.   
  5. 另一个与 UNIX cron 表达式的不同点是在表达式中支持域的数目。UNIX 给出五个域(分、时、日、月和周),Quartz 提供七个域。表 5.1 列出了 Quartz cron 表达式支持的七个域。  
  6.   
  7.    
  8. 表 5.1. Quartz Cron 表达式支持到七个域  
  9.   
  10.   
  11.   
  12.   
  13.    
  14. 名称  
  15.    
  16. 是否必须  
  17.    
  18. 允许值  
  19.    
  20. 特殊字符  
  21.    
  22.   
  23.   
  24. 秒  
  25.    
  26. 是  
  27.    
  28. 0-59  
  29.    
  30. , - * /  
  31.    
  32.   
  33.   
  34. 分  
  35.    
  36. 是  
  37.    
  38. 0-59  
  39.    
  40. , - * /  
  41.    
  42.   
  43.   
  44. 时  
  45.    
  46. 是  
  47.    
  48. 0-23  
  49.    
  50. , - * /  
  51.    
  52.   
  53.   
  54. 日  
  55.    
  56. 是  
  57.    
  58. 1-31  
  59.    
  60. , - * ? / L W C  
  61.    
  62.   
  63.   
  64. 月  
  65.    
  66. 是  
  67.    
  68. 1-12 或 JAN-DEC  
  69.    
  70. , - * /  
  71.    
  72.   
  73.   
  74. 周  
  75.    
  76. 是  
  77.    
  78. 1-7 或 SUN-SAT  
  79.    
  80. , - * ? / L C #  
  81.    
  82.   
  83.   
  84. 年  
  85.    
  86. 否  
  87.    
  88. 空 或 1970-2099  
  89.    
  90. , - * /  
  91.    
  92.   
  93.   
  94. 月份和星期的名称是不区分大小写的。FRI 和 fri是一样的。  
  95.   
  96. 域之间有空格分隔,这和 UNIX cron 一样。无可争辩的,我们能写的最简单的表达式看起来就是这个了:  
  97.   
  98. * * * ? * *  
  99.   
  100. 这个表达会每秒钟(每分种的、每小时的、每天的)激发一个部署的 job。  
  101.   
  102. ·理解特殊字符  
  103.   
  104. 同 UNIX cron 一样,Quartz cron 表达式支持用特殊字符来创建更为复杂的执行计划。然而,Quartz 在特殊字符的支持上比标准 UNIX cron 表达式更丰富了。  
  105.   
  106. * 星号  
  107.   
  108. 使用星号(*) 指示着你想在这个域上包含所有合法的值。例如,在月份域上使用星号意味着每个月都会触发这个 trigger。  
  109.   
  110. 表达式样例:  
  111.   
  112. 0 * 17 * * ?  
  113.   
  114. 意义:每天从下午5点到下午5:59中的每分钟激发一次 trigger。它停在下午 5:59 是因为值 17 在小时域上,在下午 6 点时,小时变为 18 了,也就不再理会这个 trigger,直到下一天的下午5点。  
  115.   
  116. 在你希望 trigger 在该域的所有有效值上被激发时使用 * 字符。  
  117.   
  118. ? 问号  
  119.   
  120. ? 号只能用在日和周域上,但是不能在这两个域上同时使用。你可以认为 ? 字符是 "我并不关心在该域上是什么值。" 这不同于星号,星号是指示着该域上的每一个值。? 是说不为该域指定值。  
  121.   
  122. 不能同时这两个域上指定值的理由是难以解释甚至是难以理解的。基本上,假定同时指定值的话,意义就会变得含混不清了:考虑一下,如果一个表达式在日域上有值11,同时在周域上指定了 WED。那么是要 trigger 仅在每个月的11号,且正好又是星期三那天被激发?还是在每个星期三的11号被激发呢?要去除这种不明确性的办法就是不能同时在这两个域上指定值。  
  123.   
  124. 只要记住,假如你为这两域的其中一个指定了值,那就必须在另一个字值上放一个 ?。  
  125.   
  126. 表达式样例:  
  127.   
  128. 0 10,44 14 ? 3 WEB  
  129.   
  130. 意义:在三月中的每个星期三的下午 2:10 和 下午 2:44 被触发。  
  131.   
  132. , 逗号  
  133.   
  134. 逗号 (,) 是用来在给某个域上指定一个值列表的。例如,使用值 0,15,30,45 在秒域上意味着每15秒触发一个 trigger。  
  135.   
  136. 表达式样例:  
  137.   
  138. 0 0,15,30,45 * * * ?  
  139.   
  140. 意义:每刻钟触发一次 trigger。  
  141.   
  142. /斜杠  
  143.   
  144. 斜杠 (/) 是用于时间表的递增的。我们刚刚用了逗号来表示每15分钟的递增,但是我们也能写成这样 0/15。  
  145.   
  146. 表达式样例:  
  147.   
  148. 0/15 0/30 * * * ?  
  149.   
  150. 意义:在整点和半点时每15秒触发 trigger。  
  151.   
  152. - 中划线  
  153.   
  154. 中划线 (-) 用于指定一个范围。例如,在小时域上的 3-8 意味着 "3,4,5,6,7 和 8 点。"  域的值不允许回卷,所以像 50-10 这样的值是不允许的。  
  155.   
  156. 表达式样例:  
  157.   
  158. 0 45 3-8 ? * *  
  159.   
  160. 意义:在上午的3点至上午的8点的45分时触发 trigger。  
  161.   
  162. L 字母  
  163.   
  164. L 说明了某域上允许的最后一个值。它仅被日和周域支持。当用在日域上,表示的是在月域上指定的月份的最后一天。例如,当月域上指定了 JAN时,在日域上的 L 会促使 trigger 在1月31号被触发。假如月域上是 SEP,那么 L 会预示着在9月30号触发。换句话说,就是不管指定了哪个月,都是在相应月份的时最后一天触发 trigger。  
  165.   
  166. 表达式 0 0 8 L * ? 意义是在每个月最后一天的上午 8:00 触发 trigger。在月域上的 * 说明是 "每个月"。  
  167.   
  168. 当 L字母用于周域上,指示着周的最后一天,就是星期六 (或者数字7)。所以如果你需要在每个月的最后一个星期六下午的 11:59 触发 trigger,你可以用这样的表达式 0 59 23 ? * L。  
  169.   
  170. 当使用于周域上,你可以用一个数字与 L 连起来表示月份的最后一个星期 X。例如,表达式 0 0 12 ? * 2L 说的是在每个月的最后一个星期一触发 trigger。  
  171.   
  172.    
  173.   
  174.   
  175. 不要让范围和列表值与 L 连用  
  176.   
  177. 虽然你能用星期数(1-7)与 L 连用,但是不允许你用一个范围值和列表值与 L 连用。这会产生不可预知的结果。  
  178.    
  179.   
  180.   
  181. W 字母  
  182.   
  183. W 字符代表着平日 (Mon-Fri),并且仅能用于日域中。它用来指定离指定日的最近的一个平日。大部分的商业处理都是基于工作周的,所以 W 字符可能是非常重要的。例如,日域中的 15W 意味着 "离该月15号的最近一个平日。" 假如15号是星期六,那么 trigger 会在14号(星期五)触发,因为星期四比星期一(这个例子中是17号)离15号更近。(译者Unmi注:不会在17号触发的,如果是15W,可能会是在14号(15号是星期六)或者15号(15号是星期天)触发,也就是只能出现在邻近的一天,如果15号当天为平日直接就会当日执行)。W 只能用在指定的日域为单天,不能是范围或列表值。  
  184.   
  185. # 井号  
  186.   
  187. #字符仅能用于周域中。它用于指定月份中的第几周的哪一天。例如,如果你指定周域的值为 6#3,它意思是某月的第三个周五 (6=星期五,#3意味着月份中的第三周)。另一个例子 2#1意思是某月的第一个星期一 (2=星期一,#1意味着月份中的第一周)。注意,假如你指定 #5,然而月份中没有第 5 周,那么该月不会触发。  
  188.    
  189.    
  190.    
  191. 此处的 Cron 表达式 cookbook 旨在为常用的执行需求提供方案。尽管不可能列举出所有的表达式,但下面的应该为满足你的业务需求提供了足够的例子。  
  192.   
  193. ·分钟的 Cron 表达式  
  194.   
  195.   
  196.    
  197. 表 5.1. 包括了分钟频度的任务计划 Cron 表达式  
  198.   
  199.   
  200.   
  201.   
  202.    
  203. 用法  
  204.    
  205. 表达式  
  206.    
  207.   
  208.   
  209. 每天的从 5:00 PM 至 5:59 PM 中的每分钟触发  
  210.    
  211. 0 * 17 * * ?  
  212.    
  213.   
  214.   
  215.   
  216. 每天的从 11:00 PM 至 11:55 PM 中的每五分钟触发  
  217.    
  218. 0 0/5 23 * * ?  
  219.   
  220.    
  221.   
  222.   
  223. 每天的从 3:00 至 3:55 PM 和 6:00 PM 至 6:55 PM 之中的每五分钟触发  
  224.    
  225. 0 0/5 15,18 * * ?  
  226.   
  227.    
  228.   
  229.   
  230. 每天的从 5:00 AM 至 5:05 AM 中的每分钟触发  
  231.    
  232. 0 0-5 5 * * ?  
  233.    
  234.    
  235. ·日上的 Cron 表达式  
  236.    
  237.   
  238. 表 5.2. 基于日的频度上任务计划的 Cron 表达式  
  239.   
  240.   
  241.   
  242.   
  243.    
  244. 用法  
  245.    
  246. 表达式  
  247.    
  248.   
  249.   
  250. 每天的 3:00 AM   
  251.    
  252. 0 0 3 * * ?  
  253.    
  254.   
  255.   
  256. 每天的 3:00 AM (另一种写法)   
  257.    
  258. 0 0 3 ? * *  
  259.    
  260.   
  261.   
  262. 每天的 12:00 PM (中午)  
  263.    
  264. 0 0 12 * * ?  
  265.    
  266.   
  267.   
  268. 在 2005 中每天的 10:15 AM  
  269.    
  270. 0 15 10 * * ? 2005  
  271.    
  272.   
  273. ·周和月的 Cron 表达式  
  274.   
  275.    
  276. 表 5.3. 基于周和/或月的频度上任务计划的 Cron 表达式  
  277.   
  278.   
  279.   
  280.   
  281.    
  282. 用法  
  283.    
  284. 表达式  
  285.    
  286.   
  287.   
  288. 在每个周一,二, 三和周四的 10:15 AM  
  289.    
  290. 0 15 10 ? * MON-FRI  
  291.    
  292.   
  293.   
  294. 每月15号的 10:15 AM    
  295.    
  296. 0 15 10 15 * ?  
  297.    
  298.   
  299.   
  300. 每月最后一天的 10:15 AM  
  301.    
  302. 0 15 10 L * ?  
  303.    
  304.   
  305.   
  306. 每月最后一个周五的 10:15 AM   
  307.    
  308. 0 15 10 ? * 6L  
  309.    
  310.   
  311.   
  312. 在 2002, 2003, 2004, 和 2005 年中的每月最后一个周五的 10:15 AM   
  313.    
  314. 0 15 10 ? * 6L 2002-2005  
  315.    
  316.   
  317.   
  318. 每月第三个周五的 10:15 AM  
  319.    
  320. 0 15 10 ? * 6#3  
  321.    
  322.   
  323.   
  324. 每月从第一天算起每五天的 12:00 PM (中午)  
  325.    
  326. 0 0 12 1/5 * ?  
  327.    
  328.   
  329.   
  330. 每一个 11 月 11 号的 11:11 AM  
  331.    
  332. 0 11 11 11 11 ?  
  333.    
  334.   
  335.   
  336. 三月份每个周三的 2:10 PM 和 2:44 PM  
  337.    
  338. 0 10,44 14 ? 3 WED  
  339.    
  340.   
  341. 八. 创建一个即刻触发的 Trigger  
  342.   
  343. 有时候,你需要立即执行一个 job。例如,想像一下,你正在构建一个 GUI 程序并允许用户能立刻执行。另一个例子,你或许已经检测到了某个 Job 未执行成功,因此你想要即刻重跑一次。在 Quartz 1.5,有几个方法被加入到了 TriggerUtils 类中,使得实现那些事很容易了。代码 5.4 展示了如何部署一个 job,只让它立即执行一次。   


 

[html]  view plain  copy
  1. Cron 表达式包括以下 7 个字段:  
  2.  •秒   
  3. •分   
  4. •小时   
  5. •月内日期   
  6. •月   
  7. •周内日期   
  8. •年(可选字段)   
  9.   
  10. 特殊字符  
  11.    
  12. Cron 触发器利用一系列特殊字符,如下所示:  
  13.  •反斜线(/)字符表示增量值。例如,在秒字段中“5/15”代表从第 5 秒开始,每 15 秒一次。  
  14.   
  15.   
  16. •问号(?)字符和字母 L 字符只有在月内日期和周内日期字段中可用。问号表示这个字段不包含具体值。所以,如果指定月内日期,可以在周内日期字段中插入“?”,表示周内日期值无关紧要。字母 L 字符是 last 的缩写。放在月内日期字段中,表示安排在当月最后一天执行。在周内日期字段中,如果“L”单独存在,就等于“7”,否则代表当月内周内日期的最后一个实例。所以“0L”表示安排在当月的最后一个星期日执行。  
  17.   
  18.   
  19. •在月内日期字段中的字母(W)字符把执行安排在最靠近指定值的工作日。把“1W”放在月内日期字段中,表示把执行安排在当月的第一个工作日内。  
  20.   
  21.   
  22. •井号(#)字符为给定月份指定具体的工作日实例。把“MON#2”放在周内日期字段中,表示把任务安排在当月的第二个星期一。  
  23.   
  24.   
  25. •星号(*)字符是通配字符,表示该字段可以接受任何可能的值。   
  26. 字段 允许值 允许的特殊字符   
  27. 秒 0-59 , - * /   
  28. 分 0-59 , - * /   
  29. 小时 0-23 , - * /   
  30. 日期 1-31 , - * ? / L W C   
  31. 月份 1-12 或者 JAN-DEC , - * /   
  32. 星期 1-7 或者 SUN-SAT , - * ? / L C #   
  33. 年(可选) 留空, 1970-2099 , - * /   
  34. 表达式意义   
  35. "0 0 12 * * ?" 每天中午12点触发   
  36. "0 15 10 ? * *" 每天上午10:15触发   
  37. "0 15 10 * * ?" 每天上午10:15触发   
  38. "0 15 10 * * ? *" 每天上午10:15触发   
  39. "0 15 10 * * ? 2005" 2005年的每天上午10:15触发   
  40. "0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发   
  41. "0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发   
  42. "0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发   
  43. "0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发   
  44. "0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发   
  45. "0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发   
  46. "0 15 10 15 * ?" 每月15日上午10:15触发   
  47. "0 15 10 L * ?" 每月最后一日的上午10:15触发   
  48. "0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发   
  49. "0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发   
  50. "0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发   
  51. 每天早上6点   
  52.   
  53. 0 6 * * *   
  54.   
  55. 每两个小时   
  56.   
  57. 0 */2 * * *   
  58. 晚上11点到早上8点之间每两个小时,早上八点   
  59.   
  60. 0 23-7/2,8 * * *   
  61.   
  62. 每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点   
  63.   
  64. 0 11 4 * 1-3   
  65. 1月1日早上4点   
  66.   
  67. 0 4 1 1 *  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值