天天看點

【SSH項目實戰】國稅協同平台-34.quartz&CronTrigger

我們上次使用quartz任務排程架構建立了一個在背景按照時間間隔不停運作的任務,我們使用的是simpletrigger簡單觸發器,為了實作我們的月末自動回複的功能,我們要設定觸發器能夠在某個精确時間去自動執行任務,那麼使用simpletrigger簡單觸發器就遠遠不夠了,我們需要使用crontrigger任務觸發器來實作這個功能。

我們的crontrigger設定步驟如下:

任務觸發器(crontrigger)

① 設定任務詳細

② 設定執行時機(cronexpression)

cronexpression:秒 分 時 日 月 周 年(可選)

我們先在任務類中寫另外一個執行方法:

就是上面的docrontriggertask()

然後修改我們的quartz的配置檔案quartz-spring.xml如下:

crontrigger中的 cronexpression 表達式屬性中接收的内容:

在表達式中時間格式間用空格隔開,每個時間表示:秒 分鐘 小時 日 月 周 年(可選填)

可出現的值和符合:

【SSH項目實戰】國稅協同平台-34.quartz&CronTrigger

'*' 字元可以用于所有字段,在“分”字段中設為"*"表示"每一分鐘"的含義。

'?' 字元可以用在“日”和“周幾”字段. 它用來指定 '不明确的值'. 這在你需要指定這兩個字段中的某一個值而不是另外一個的時候會被用到。在後面的例子中可以看到其含義。

'-' 字元被用來指定一個值的範圍,比如在“小時”字段中設為"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"則表示"月曆中的第一天或者周日及其以後"。

對于“月份”字段和“周幾”字段來說合法的字元都不是大小寫敏感的。

官方文檔示例:

【SSH項目實戰】國稅協同平台-34.quartz&CronTrigger

我們在其中設定的是"0/3 * * * * ?"意思就是每天每時每隔3秒執行一次任務。我們和之前的simpletrigger一起執行,來測試我們的配置是否成功:

重新開機伺服器,發現控制台輸出以下資訊:

我們可以看到simpletrigger和crontrigger同時執行,而且crontrigger是每隔3秒執行一次。

這證明我們的配置是成功的。大家可以按照上面給的配置規則來測試其他的配置,這裡就不再一一測試了。

接下來我們就可以着手實作我們的需求

我們的需求是每月最後一天去自動處理尚未回複的速投請求,将沒有回複的投訴設定為“已失效”。在背景管理中不能對該類型投訴進行回複。

時機:每個月月底最後一天;cronexpression:10 10 2 l * ?(淩晨2點10分10秒自動處理,為了避開工作高峰時間)

執行什麼内容:對本月之前的待受理投訴進行自動處理;将投訴資訊的狀态改為 已失效

如何執行:

本月之前的待受理投訴:select * from complain where 投訴時間 < 本月1号0時0分0秒

首先在我們的“投訴”子產品的包下的spring配置檔案中加入我們的配置:

然後我們可以看到,我們的任務執行類是complainservice,其中任務執行方法是autodetail方法,我們下面在complainservice類中去編寫autodetail方法:

接口中定義此方法:

首先類中實作該方法:

這樣,我們每個月的月底的淩晨2點10分10秒就會自動執行complainservice中的autodeal方法,來設定本月之前的所有未回複的投訴資訊為"無效的"。

然後“無效的”投訴是不能夠回複的,我們在jsp中加上這個控制,使得所有無效的投訴的“回複”連結失效:

效果:

【SSH項目實戰】國稅協同平台-34.quartz&CronTrigger

至此,我們的quartz與simpletrigger、crontrigger學習完畢,月底自動回複功能也已經實作。

轉載請注明出處:http://blog.csdn.net/acmman/article/details/50205893