Quartz框架中的Trigger
定義任務的觸發規律,Trigger,使用 TriggerBuilder來構建。
JobDetail跟 Trigger是 1:N的關系。
思考:為什么要解耦?
Trigger接口在 Quartz有 4個繼承的子接口:
?
| SimpleTrigger | 簡單觸發器 | 固定時刻或時間間隔,毫秒 |
| CalendarIntervalTrigger | 基于日歷的觸發器 | 比簡單觸發器更多時間單位,支持非固定時 間的觸發,例如一年可能365/366,一個月 可能28/29/30/31 |
| DailyTimeIntervalTrigger | 基于日期的觸發器 | 每天的某個時間段 |
| CronTrigger | 基于Cron 表達式的觸發器 | ? |
MutableTrigger和 CoreTrigger最終也是用到以上四個類的實現類。
SimpleTrigger
SimpleTrigger可以定義固定時刻或者固定時間間隔的調度規則(精確到毫秒)。
例如:每天 9點鐘運行;每隔 30分鐘運行一次。?
CalendarIntervalTrigger
CalendarIntervalTrigger可以定義更多時間單位的調度需求,精確到秒。
好處是不需要去計算時間間隔,比如 1個小時等于多少毫秒。
例如每年、每個月、每周、每天、每小時、每分鐘、每秒。
每年的月數和每個月的天數不是固定的,這種情況也適用。?
DailyTimeIntervalTrigger
每天的某個時間段內,以一定的時間間隔執行任務。
例如:每天早上 9點到晚上 9點,每隔半個小時執行一次,并且只在周一到周六執行。
CronTrigger
CronTirgger可以定義基于 Cron表達式的調度規則,是最常用的觸發器類型。
Cron表達式
| 1 | 秒 | 0-59 | , - * / |
| 2 | 分鐘 | 0-59 | , - * / |
| 3 | 小時 | 0-23 | , - * / |
| 4 | 日期 | 1-31 | , - * ? / L W C |
| 5 | 月份 | 1-12 | , - * / |
| 6 | 星期 | 1-7 | , - * ? / L W C |
| 7 | 年份(可選) | 1-31 | , - * / |
L:該字符只在日期和星期字段中使用,代表“ Last”的意思,但它在兩個字段中意思不同。?L在日期字段中,表示這個月份的最后一天,如一月的 31號,非閏年二月的 28號;如果 L用在星期中,則表示星期六,等同于?7。但是,如果 L出現在星期字段里,而且在前面有一個數值 X,則表示“這個月的最后 X天”,例如, 6L表示該月的最后星期五;?
W:該字符只能出現在日期字段里,是對前導日期的修飾,表示離該日期最近的工作日。例如 15W表示離該月 15號最近的工作日,如果該月?15號是星期六,則匹配 14號星期五;如果 15日是星期日,則匹配 16號星期一;如果15號是星期二,那結果就是15號星期二。但必須注意關聯的匹配日期不能夠跨月,如你指定?1W,如果 1號是星期六,結果匹配的是 3號星期一,而非上個月最后的那天。W字符串只能指定單一日期,而不能指定日期范圍;?
LW組合:在日期字段可以組合使用 LW,它的意思是當月的最后一個工作日;
井號 (#):該字符只能在星期字段中使用,表示當月某個工作日。如?6#3表示當月的第三個星期五 (6表示星期五, #3表示當前的第三個?),而 4#5表示當月的第五個星期三,假設當月沒有第五個星期三,忽略不觸發;?
C:該字符只在日期和星期字段中使用,代表“ Calendar”的意思。它的意思是計劃所關聯的日期,如果日期沒有被關聯,則相當于日歷中所有日期。例如 5C在日期字段中就相當于日歷 5日以后的第一天。?1C在星期字段中相當于星期日后的第一天。
?
Cron表達式對特殊字符的大小寫不敏感,對代表星期的縮寫英文大小寫也不敏感。上面我們定義的都是在什么時間執行,但是我們有一些在什么時間不執行的需求,比如:理財周末和法定假日購買不計息;證券公司周末和法定假日休市。是不是要把日期寫在數據庫中,然后讀取基于當前時間判斷呢?
?
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的Quartz框架中的Trigger的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Quartz Java编程
- 下一篇: Quartz框架基于Calendar的排