最近在解決產品上的一個需求,就是按期生成報告(Report),咱們叫作Scheduled Report。html
原理:UI獲取用戶輸入的時間信息,後臺使用Spring框架設置定時任務,這裏定時任務用的就是 Quartz Cron表達式。java
下面介紹下我學習的Quartz Cron表達式。框架
1. Quartz Cron表達式和Linux Cron表達式(Cron job)有何區別?學習
其實語法很是像。一個大的區別時,Quartz Cron表達式提供最後一個可選參數"年",而Linux Cron表達式沒有。spa
2. Quartz Cron表達式語法.net
這裏就附上一張官方的介紹表格。不少博文都有用到過。htm
只不過我以爲有幾件事須要注意:blog
A. "*" 和 "?"的區別產品
"*"意爲該域全部的值,"?"爲不爲該域指定值。具體用得時候,"?"只有Day of Month和Day of week用到,並且咱們在用的時候這兩個域有且只有一個"?",由於同時指定值是會有歧義的,你會不肯定到底哪天來執行。ast
B. "L"的用法
這也是咱們產品遇到的一個問題。最初咱們在UI前臺給用戶的選項中若是是月度報告,提供了1-31天,31個選項來讓用戶選擇。可是咱們知道,有些月份,是沒有31天得,最少的二月份可能只有28天。因此這樣硬設定生成的Cron表達式會有問題,致使某些月份沒有Report生成。因此這裏我作了一下改進,利用Quartz表達式的"L"特性,"L"是指定爲本月或本週的最後一天執行。
因此這裏在UI上,咱們顯示的月天數選項是"1-28,last day"三個選項,理由以下:
a. 1-28,每月至少有28天,用戶選擇後必定會在那天成功執行。
b. 用戶選擇"last day",咱們就在每個月最後一天執行,也能保證用戶的報告每個月生成。
固然咱們在UI上還提供了一個時區的選項,時間要先根據時區作下轉換,再用於生成Cron表達式。
3. 下面列出"天天","每個月","每週"執行的Quartz Cron表達式的寫法
A. 天天
秒 分 時 * * ?
B. 每個月
秒 分 時 每個月的哪天(1-31,或"L") * ?
C. 每週
秒 分 時 ? * 每週的哪天(1-7,注意1表明週日Sunday,而非週一Monday)
4. 參考
A. http://www.blogjava.net/fancydeepin/archive/2012/06/12/quartz-cron.html
Kevin Song
2015年4月13日下午