C#-进击Hangfire
Hangfire 分布式后端作業(yè)調(diào)度框架服務(wù)
- CronExpression(cron表達(dá)式)- CronTriggers(cron觸發(fā)器)
- 格式
- 字段含義
- 部分示例
- cron表達(dá)式在線生成
- Hangfire對(duì)于cron表達(dá)式支持的那些坑
CronExpression(cron表達(dá)式)- CronTriggers(cron觸發(fā)器)
CronTriggers往往比SimpleTrigger更有用,如果您需要基于日歷的概念,而非SimpleTrigger完全指定的時(shí)間間隔,復(fù)發(fā)的發(fā)射工作的時(shí)間表。
CronTrigger,你可以指定觸發(fā)的時(shí)間表如“每星期五中午”,或“每個(gè)工作日9:30時(shí)”,甚至“每5分鐘一班9:00和10:00逢星期一上午,星期三星期五“。
即便如此,SimpleTrigger一樣,CronTrigger擁有的startTime指定的時(shí)間表時(shí)生效,指定的時(shí)間表時(shí),應(yīng)停止(可選)結(jié)束時(shí)間。
cron ['kr?n] :克龍(時(shí)間單位,等于百萬(wàn)年)
trigger [?tr?ɡ?]
格式
cron表達(dá)式是一個(gè)字符串,字符串以5或6個(gè)空格隔開,分為6或7個(gè)域,每一個(gè)域代表一個(gè)含義,Cron有如下兩種語(yǔ)法格式:
Seconds Minutes Hours DayofMonth Month DayofWeek Year
或
Seconds Minutes Hours DayofMonth Month DayofWeek
字段含義
| Seconds (秒) | 可以用數(shù)字 0-59 ,’ - ’ , ’ * ’ , ’ / ’ 表示 |
| Minutes(分) | 可以用數(shù)字 0-59 ,’ - ’ , ’ * ’ , ’ / ’ 表示 |
| Hours(時(shí)) | 可以用數(shù)字 0 - 23,’ - ’ , ’ * ’ , ’ / ’ 表示 |
| Day-of-Month(天) | 可以用數(shù)字 1 - 31 ,’ - ’ , ’ * ’ , ’ ? ’ , ’ / ’ , ’ L ’ , ’ W ’ , ’ C ’ 表示,但要注意一些特別的月份 |
| Month(月) | 可以用 0 - 11 ,或用字符串 “JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV , DEC” ,或 ’ - ’ , ’ * ’ , ’ / ’ 表示 |
| Day-of-Week(周) | 可以用數(shù)字 1 - 7 表示(1 = 星期日),或用字符口串“SUN, MON, TUE, WED, THU, FRI , SAT”,或 ’ - ’ , ’ * ’ , ’ ? ’ , ’ / ’ , ’ L ’ , ’ C ’ , ’ # ’ 表示 |
| Year(年) | 可以留空,或 1970 - 2099 ,’ - ’ , ’ * ’ , ’ / ’ 表示 |
| * | 表示所有值 | 如在Minutes域使用*, 即表示每分鐘都會(huì)觸發(fā)事件 | |
| ? | 表示未說明的值,即不關(guān)心它為何值 | 只能用在DayofMonth和DayofWeek域 | 它也匹配域的任意值,但實(shí)際不會(huì)。因?yàn)镈ayofMonth和DayofWeek會(huì)相互影響。例如想在每月的20日觸發(fā)調(diào)度,不管20日到底是星期幾,則只能使用如下寫法: 13 13 15 20 * ?, 其中最后一位只能用?,而不能使用*,如果使用*表示不管星期幾都會(huì)觸發(fā) |
| - | 表示一個(gè)指定的范圍 | 如在Minutes域使用5-20,表示從5分到20分鐘每分鐘觸發(fā)一次 | |
| , | 表示列出枚舉值 | 在Minutes域使用5,20,則意味著在5和20分每分鐘觸發(fā)一次 | |
| / | 符號(hào)前表示開始時(shí)間,符號(hào)后表示每次遞增的值 | 如“0/15”表示每隔15分鐘執(zhí)行一次,“0”表示為從“0”分開始, “3/20”表示表示每隔20分鐘執(zhí)行一次,“3”表示從第3分鐘開始執(zhí)行 | |
| # | 表示這個(gè)月的第幾個(gè)周幾 ,符號(hào)前為周幾,符號(hào)后為第幾個(gè) | 只能用在day-of-week域 | 如"6#3"指這個(gè)月第3個(gè)周五(6指周五,3指第3個(gè))。如果指定的日期不存在,觸發(fā)器就不會(huì)觸發(fā) |
| L | 表示最后 | 只能出現(xiàn)在DayofWeek和DayofMonth域 | 用在day-of-month字段意思是 “這個(gè)月最后一天”;用在 day-of-week字段, 它簡(jiǎn)單意思是 “7” or “SAT”。 如果在day-of-week字段里和數(shù)字聯(lián)合使用,它的意思就是 “這個(gè)月的最后一個(gè)星期幾” – 例如: “6L” 意味"這個(gè)月的最后一個(gè)星期五" |
| W | 表示最接近指定天的工作日(周一到周五),系統(tǒng)將在離指定日期的最近的有效工作日觸發(fā)事件 | 只能出現(xiàn)在DayofMonth域 | 在day-of-month字段用“15W”指“最接近這個(gè) 月第15天的工作日”,即如果這個(gè)月第15天是周六,那么觸發(fā)器將會(huì)在這個(gè)月第14天即周五觸發(fā);如果這個(gè)月第15天是周日,那么觸發(fā)器將會(huì)在這個(gè)月第 16天即周一觸發(fā);如果這個(gè)月第15天是周二,那么就在觸發(fā)器這天觸發(fā)。注意一點(diǎn):這個(gè)用法只會(huì)在當(dāng)前月計(jì)算值,不會(huì)越過當(dāng)前月。“W”字符僅能在 day-of-month指明一天,不能是一個(gè)范圍或列表。也可以用“LW”來指定這個(gè)月的最后一個(gè)工作日 |
| LW | 表示在某個(gè)月最后一個(gè)工作日 | 只能出現(xiàn)在DayofMonth域 | 即最后一個(gè)星期五 |
| C | 指和calendar聯(lián)系后計(jì)算過的值 | 如在day-of-month 字段用“5C”指在這個(gè)月第5天或之后包括calendar的第一天;在day-of-week字段用“1C”指在這周日或之后包括calendar的第一天 |
部分示例
*/5 * * * * ? 每隔5秒執(zhí)行一次
0 */1 * * * ? 每隔1分鐘執(zhí)行一次
0 0 5-15 * * ? 每天5-15點(diǎn)整點(diǎn)觸發(fā)
0 0/3 * * * ? 每三分鐘觸發(fā)一次
0 0-5 14 * * ? 在每天下午2點(diǎn)到下午2:05期間的每1分鐘觸發(fā)
0 0/5 14 * * ? 在每天下午2點(diǎn)到下午2:55期間的每5分鐘觸發(fā)
0 0/5 14,18 * * ? 在每天下午2點(diǎn)到2:55期間和下午6點(diǎn)到6:55期間的每5分鐘觸發(fā)
0 0/30 9-17 * * ? 朝九晚五工作時(shí)間內(nèi)每半小時(shí)
0 0 10,14,16 * * ? 每天上午10點(diǎn),下午2點(diǎn),4點(diǎn)
0 0 12 ? * WED 表示每個(gè)星期三中午12點(diǎn)
0 0 17 ? * TUES,THUR,SAT 每周二、四、六下午五點(diǎn)
0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44觸發(fā)
0 15 10 ? * MON-FRI 周一至周五的上午10:15觸發(fā)
0 0 23 L * ? 每月最后一天23點(diǎn)執(zhí)行一次
0 15 10 L * ? 每月最后一日的上午10:15觸發(fā)
0 15 10 ? * 6L 每月的最后一個(gè)星期五上午10:15觸發(fā)
0 15 10 * * ? 2005 2005年的每天上午10:15觸發(fā)
0 15 10 ? * 6L 2002-2005 2002年至2005年的每月的最后一個(gè)星期五上午10:15觸發(fā)
0 15 10 ? * 6#3 每月的第三個(gè)星期五上午10:15觸發(fā)
“30 * * * * ?” 每半分鐘觸發(fā)任務(wù)
“30 10 * * * ?” 每小時(shí)的10分30秒觸發(fā)任務(wù)
“30 10 1 * * ?” 每天1點(diǎn)10分30秒觸發(fā)任務(wù)
“30 10 1 20 * ?” 每月20號(hào)1點(diǎn)10分30秒觸發(fā)任務(wù)
“30 10 1 20 10 ? *” 每年10月20號(hào)1點(diǎn)10分30秒觸發(fā)任務(wù)
“30 10 1 20 10 ? 2011” 2011年10月20號(hào)1點(diǎn)10分30秒觸發(fā)任務(wù)
“30 10 1 ? 10 * 2011” 2011年10月每天1點(diǎn)10分30秒觸發(fā)任務(wù)
“30 10 1 ? 10 SUN 2011” 2011年10月每周日1點(diǎn)10分30秒觸發(fā)任務(wù)
“15,30,45 * * * * ?” 每15秒,30秒,45秒時(shí)觸發(fā)任務(wù)
“15-45 * * * * ?” 15到45秒內(nèi),每秒都觸發(fā)任務(wù)
“15/5 * * * * ?” 每分鐘的每15秒開始觸發(fā),每隔5秒觸發(fā)一次
“15-30/5 * * * * ?” 每分鐘的15秒到30秒之間開始觸發(fā),每隔5秒觸發(fā)一次
“0 0/3 * * * ?” 每小時(shí)的第0分0秒開始,每三分鐘觸發(fā)一次
“0 15 10 ? * MON-FRI” 星期一到星期五的10點(diǎn)15分0秒觸發(fā)任務(wù)
“0 15 10 L * ?” 每個(gè)月最后一天的10點(diǎn)15分0秒觸發(fā)任務(wù)
“0 15 10 LW * ?” 每個(gè)月最后一個(gè)工作日的10點(diǎn)15分0秒觸發(fā)任務(wù)
“0 15 10 ? * 5L” 每個(gè)月最后一個(gè)星期四的10點(diǎn)15分0秒觸發(fā)任務(wù)
“0 15 10 ? * 5#3” 每個(gè)月第三周的星期四的10點(diǎn)15分0秒觸發(fā)任務(wù)
cron表達(dá)式在線生成
在線Cron表達(dá)式生成器
quartz/Cron/Crontab表達(dá)式在線生成工具
Hangfire對(duì)于cron表達(dá)式支持的那些坑
- 截止目前為止我使用的是1.6.22,就是最新免費(fèi)版本驗(yàn)證發(fā)現(xiàn)下面這些。
- hangfire因?yàn)樽疃嗟椒昼娂?jí)別,所以,其支持的cron表達(dá)式僅僅只有5個(gè)域,沒有秒和年,即 Minutes Hours DayofMonth Month DayofWeek 。所以如果自己直接寫cron字符串的話,超過五個(gè)域它會(huì)報(bào)錯(cuò)。
- 對(duì)于cron表達(dá)式中的一些拓展字符并不支持,目前發(fā)現(xiàn)有 對(duì)于 L ,?并不能夠識(shí)別,對(duì)于月和周的JAN - DEC,SUN - SAT也不識(shí)別,只能是1-31,1-7。所以自己寫字符串請(qǐng)不要帶上這些字符。如配置每月最后一天就無法直接配置,必須自己手動(dòng)寫一些邏輯才行。What happens on day 31的官方論壇討論
感謝以下參考資料,本人做的主要是驗(yàn)證、學(xué)習(xí)、整合:
cron表達(dá)式詳解,cron表達(dá)式寫法,cron表達(dá)式例子
Cron表達(dá)式說明
cron表達(dá)式詳解
總結(jié)
以上是生活随笔為你收集整理的C#-进击Hangfire的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信小程序--火车票查询
- 下一篇: C#/音乐播放器/带进度条/歌词滚动、颜