我(wo)心(xin)(xin)中的(de)核心(xin)(xin)組件(jian)(可插(cha)拔的(de)AOP)~調度組件(jian)quartz.net續~任務管(guan)理(li)器的(de)開(kai)發(CronTrigger強大功(gong)能)
上次我們開發了一個quartz的管理工具,主要使用(yong)的(de)是Simple Trigger做(zuo)為觸發器的(de),如果各位覺得它(ta)過(guo)于簡單不能實現(xian)我(wo)們(men)的(de)功(gong)能,我(wo)們(men)可以(yi)引入Cron這個概(gai)念,它(ta)叫(jiao)做(zuo)時間表達式,它(ta)可以(yi)靈活(huo)的(de)去設置各種策略,我(wo)們(men)先來看一(yi)下cron expression的(de)一(yi)些基礎的(de)知識吧(ba)
格式: [秒] [分] [小時] [日] [月] [周] [年]
序號 說明 是否必填 允許填寫的值 允許的通配符
1 秒 是 0-59 , - * /
2 分 是 0-59 , - * /
3 小時 是 0-23 , - * /
4 日 是 1-31 , - * ? / L W
5 月 是 1-12 or JAN-DEC , - * /
6 周 是 1-7 or SUN-SAT , - * ? / L #
7 年 否 empty 或 1970-2099 , - * /
通配符說明:
1. 反斜(xie)線(/)字符表示(shi)增量值。例如,在秒(miao)字段中“5/15”代表從第(di) 5 秒(miao)開始,每 15 秒(miao)一次。
2. 星號(*)字(zi)符是通配字(zi)符,表示(shi)該字(zi)段可以接受任何可能的(de)值(例如:在分的(de)字(zi)段上設(she)置(zhi) "*",表示(shi)每一分鐘都會觸(chu)發)。
3. 問號(?)問號表示這個字段不包含具體值。所以,如果指定月內日期,可以在月內日期字段中插入“?”,表示周內日期值無關緊要。字母 L 字符是 last 的縮寫(xie)。放在(zai)月內(nei)日(ri)(ri)期字(zi)段(duan)中,表(biao)示安排在(zai)當(dang)月最后一天執(zhi)(zhi)行。在(zai)周內(nei)日(ri)(ri)期字(zi)段(duan)中,如果(guo)“L”單獨(du)存在(zai),就(jiu)等于(yu)“7”,否則(ze)代表(biao)當(dang)月內(nei)周內(nei)日(ri)(ri)期的最后一個實例。所以“0L”表(biao)示安排在(zai)當(dang)月的最后一個星期日(ri)(ri)執(zhi)(zhi)行。
4. - 表示區間,例如 在小時上設置 "10-12",表示 10,11,12點都(dou)會觸發(fa)。
5. 逗(dou)號(hao)(, ) 表(biao)示指(zhi)定(ding)多個值(zhi),例如在(zai)周(zhou)字段上設置 "MON,WED,FRI" 表(biao)示周(zhou)一,周(zhou)三和(he)周(zhou)五觸發
6. 井號(#)字符為(wei)給定月份指(zhi)定具體(ti)的工作日(ri)實例(li)。把“MON#2”放在周(zhou)內日(ri)期字段中,表示把任(ren)務(wu)安排在當月的第二個星期一。
7. L 表 示最后的意思。在日字段設置上,表示當月的最后一天(依據當前月份,如果是二月還會依據是否是潤年[leap]), 在周字段上表示星期六,相當于"7" 或"SAT"。如果在"L"前加上數字,則表示該數據的最后一個。例如在周字段上設置"6L"這樣的格式,則表示“本月最后一個星期五"。
8. W 表 示離指定日期的(de)最近(jin)那(nei)(nei)個工作日(周(zhou)一至周(zhou)五). 例如(ru)在(zai)日字段上設置"15W",表示離每(mei)月(yue)15號(hao)最近(jin)的(de)那(nei)(nei)個工作日觸發(fa)。如(ru)果(guo)(guo)15號(hao)正(zheng)好(hao)是(shi)周(zhou)六,則找(zhao)(zhao)最近(jin) 的(de)周(zhou)五(14號(hao))觸發(fa), 如(ru)果(guo)(guo)15號(hao)是(shi)周(zhou)未(wei),則找(zhao)(zhao)最近(jin)的(de)下(xia)周(zhou)一(16號(hao))觸發(fa).如(ru)果(guo)(guo)15號(hao)正(zheng)好(hao)在(zai)工作日(周(zhou)一至周(zhou)五),則就在(zai)該(gai)天觸發(fa)。如(ru)果(guo)(guo)指定格式 為 "1W",它則表示每(mei)月(yue)1號(hao)往后(hou)最近(jin)的(de)工作日觸發(fa)。如(ru)果(guo)(guo)1號(hao)正(zheng)是(shi)周(zhou)六,則將在(zai)3號(hao)下(xia)周(zhou)一觸發(fa)。(注,"W"前只(zhi)能設置具(ju)體的(de)數字,不允(yun)許區 間"-")。注:'L'和 'W'可(ke)以一(yi)組合使用。如果在日(ri)字段上設置"LW",則(ze)表示(shi)在本月的最后(hou)一(yi)個工作(zuo)日(ri)觸(chu)發。
常用示例
0 10 * * * ?--------------每個小時過10分執行一次
0 0/32 8,12 * * ? ----------每天8:32,12:32 執行(xing)一次
0 0/2 * * * ?--------------每2分鐘(zhong)執行一次
0 0 12 * * ?---------------在(zai)每(mei)天(tian)中午12:00觸(chu)發
0 15 10 ? * *---------------每天上(shang)午10:15 觸發
0 15 10 * * ?---------------每天上午10:15 觸(chu)發(fa)
0 15 10 * * ? *---------------每天上(shang)午10:15 觸發
0 15 10 * * ? 2005---------------在2005年中(zhong)的每天(tian)上午(wu)10:15 觸(chu)發
0 * 14 * * ?---------------每天在下午2:00至2:59之間每分鐘觸發一次
0 0/5 14 * * ?---------------每天在下午2:00至2:59之間每5分鐘觸發(fa)一次
0 0/5 14,18 * * ?---------------每天在下午2:00至2:59和6:00至6:59之間的(de)每5分鐘觸發一次
0 0-5 14 * * ?---------------每天(tian)在下午2:00至2:05之間每分(fen)鐘觸(chu)發一次
0 10,44 14 ? 3 WED---------------每(mei)三(san)月份(fen)的星(xing)期三(san)在下午2:00和2:44時觸發
0 15 10 ? * MON-FRI---------------從(cong)星期一至星期五的每(mei)天上午10:15觸發
0 15 10 15 * ?---------------在每個月(yue)的每15天的上午10:15觸發
0 15 10 L * ?---------------在每個月的(de)最后(hou)一天的(de)上午10:15觸發
0 15 10 ? * 6L---------------在每個月的(de)最后一個星期五的(de)上午10:15觸發
0 15 10 ? * 6L 2002-2005---------------在2002, 2003, 2004 and 2005年的(de)每個月(yue)的(de)最后(hou)一個星(xing)期(qi)五的(de)上(shang)午10:15觸發
0 15 10 ? * 6#3---------------在(zai)每(mei)個月的第三個星期五(wu)的上(shang)午10:15觸(chu)發
0 0 12 1/5 * ?---------------從每月的第一天起每過5天的中午12:00時觸發
0 11 11 11 11 ?---------------在每(mei)個11月11日(ri)的上午11:11時(shi)觸發.
最后設計一下模型
/// <summary> /// Cron 觸發器對象 /// </summary> public class QuartzCronModel { [DisplayName("任務名(ming)稱(cheng)")] [Required] public string JobName { get; set; } [DisplayName("工作組名稱")] [Required] public string JobGroup { get; set; } [DisplayName("任務(wu)程序(xu)集")] [Required] public string Dll { get; set; } [DisplayName("觸發器名稱(cheng)")] [Required] public string TriggerName { get; set; } [DisplayName("觸發器工作組")] [Required] public string TriggerGroup { get; set; } [DisplayName("Cron表達式")] [Required] public string CronExpression { get; set; } [DisplayName("運行狀態")] [ReadOnly(true)] public TriggerState RunStatus { get; set; }
運行后的效果如圖