NO IMAGE
之前在工作開發的過程中,使用到了quartz這個元件做定時任務類的功能,期間遇上了關於cron表示式的小問題一直沒有注意,直到功能上線才發現。故在此再重新再百度並整理一下cron表示式方面的知識內容,也給自己強化一下這方面的記憶,不再犯之前的錯誤。
一、Cron表示式:
Cron表示式是一個字串,字串以5或6個空格隔開,分為6或7個域,每一個域代表一個含義,Cron有如下語法格式: 
秒 分 時 日 月 星期幾 年 (每位之間用空格隔開)
二、表示式每一位的範圍:
秒:有效範圍為0-59的整數;
分:有效範圍為0-59的整數;
小時:有效範圍為0-23的整數;
日:有效範圍為1-31的整數;
月:有效範圍為1-12的整數或JAN-DEC;
周幾:有效範圍為1-7的整數或SUN-SAT兩個範圍(注意:1表示星期天!如此類推!所以最好還是用英文縮寫比較好,畢竟週日表1不符合國人常識);
年:有效範圍為1970-2099年。
三、表示式中可以使用的特殊符號:
1. “*”:表示匹配該域的任意值,可在cron表示式中任一位使用,假如在“分鐘”位使用*, 即表示每分鐘都會觸發事件。
2. “?”:只能用在日和周幾的兩個位中使用。它也匹配域的任意值,但實際不會。因為日和周幾這兩位會相互影響!例如想在每月的20日觸發排程,不管20日到底是星期幾,則只能使用如下寫法:
0 0 0 20 * ?
其中最後一位只能用?,而不能使用*,如果使用*表示不管星期幾都會觸發,實際上並不是這樣。 
3. “-”:表示範圍,可在表示式中任一位使用,例如在分鐘位使用5-20,表示從5分到20分鐘每分鐘觸發一次。
4. “/”:表示起始時間開始觸發,然後每隔固定時間觸發一次,可在任一位中使用,例如在分鐘位使用5/20,則意味著5分鐘觸發一次,而第25(5 20)分,第45(5 20 20)分等分別觸發一次。 
5. “,”:表示列出列舉值值。例如:在分鐘位使用5,20,則意味著在5和20分每分鐘觸發一次。
6. “L”:表示最後,只能出現在日和周幾這兩位,如果在周幾這一位使用5L,意味著在最後的一個星期四觸發。
7. “W”:表示有效工作日(週一到週五),只能出現在周幾這位,系統將在離指定日期的最近的有效工作日觸發事件。例如:使用5W,如果5日是星期六,則將在最近的工作日:星期五,即4日觸發。如果5日是星期天,則在6日(週一)觸發;如果5日在星期一到星期五中的一天,則就在5日觸發。另外一點,W的最近尋找不會跨過月份(LW 這兩個字元可以連用,表示在某個月最後一個工作日,即最後一個星期五)。 
8. “#”:用於確定每個月第幾個星期幾,只能出現在“周幾”這位。例如在4#2,表示某月的第二個星期三。
四、常用cron表示式示例:
借用百度來的這位朋友的例子:
http://www.cnblogs.com/linjiqin/archive/2013/07/08/3178452.html
0 0 10,14,16 * * ? 每天上午10點,下午2點,4點 
0 0/30 9-17 * * ? 朝九晚五工作時間內每半小時 
0 0 12 ? * WED 表示每個星期三中午12點 
“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做一個每週一凌晨觸發的定時任務,開始的時候,觸發器配置成如下:
 <bean
id=“expansionCronTrigger”
class=“org.springframework.scheduling.quartz.CronTriggerBean”>
      
<property name=“jobDetail”
ref=“expansionWorkSheetScheduler”
/>
      
<property name=“cronExpression”>
          
<value>0/10 * 2-7 * * MON</value> 
          
<!– 下面一個為測試cron表示式配置 –>
<!–              <value>10 * * * * ?</value>  –>
      
</property>
 
</bean>
測試的時候用的都是下面一個表示式,故沒有測試出錯誤,上線的時候卻報錯,當時檢查了一遍表示式,又替換了下面一個測試表示式執行,鎖定了問題在<value>0/10 * 2-7 * * MON</value> 這個配置中,但是自己看了好久,沒有發現什麼問題(當時不知道“日”位與“周幾”位又特殊的注意事項)。
後來百度了相關知識,又用了線上的cron表示式生成器比對,才發現問題出在了“日”位上,這一位上的“*”表示任一日都可觸發,但是“周幾”位上我又指定了“MON”,引起了衝突!問題原因查明,是自己對cron表示式細節掌握程度不足導致配置錯誤。將cron表示式改成
<value>0/10 * 2-7 ? * MON</value>
問題解決。