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