Quartz.Net進階之二:關於觸發器的更多資訊
與作業一樣,觸發器相對容易使用,但是在您可以充分利用Quartz.NET之前,確實需要了解和理解各種可自定義的選項。 此外,如前所述,您可以選擇不同型別的觸發器來滿足不同的排程需求。
1、常見觸發器屬性(Common Trigger Attributes)
除了所有觸發器型別都具有用於跟蹤其身份的TriggerKey屬性之外,還有許多其他屬性對所有觸發器型別都是通用的。 在構建觸發器定義時,使用TriggerBuilder設定這些常用屬性(後面將舉例說明)。
以下是所有觸發器型別共有的屬性列表:
1)、JobKey 屬性指示觸發器觸發時應該執行作業的標識。
2)、StartTimeUtc 屬性指示觸發器的計劃首次生效是什麼時候。該值是DateTimeOffset物件,用於定義給定日曆日期的時刻。對於某些觸發器型別,觸發器實際上會在開始時觸發,對於其他觸發器型別,它只是標記應該開始遵循排程的時間。這意味著您可以儲存一個觸發器,其中包含一個計劃,例如1月份的“每月的第5天”,如果StartTimeUtc屬性設定為4月1日,則會在第一次觸發前幾個月。
3)、EndTimeUtc 屬性指示觸發器的排程計劃何時不再有效。換句話說,具有“每月的第5天”和7月1日結束時間表的觸發器將在6月5日的最後一次觸發後將結束。
其他的屬性需要更多時間來解釋,將在以下小節中討論。
2、優先順序
有時,當您有許多觸發器(或Quartz.NET執行緒池中的工作執行緒比較少)時,Quartz.NET可能沒有足夠的資源來立即觸發計劃中該同時觸發的所有觸發器。 在這種情況下,您可能希望控制哪些觸發器在可用的Quartz.NET工作執行緒中首先觸發。為此,您可以在Trigger上設定priority屬性。 如果同時觸發N個觸發器,但是當前只有Z個工作執行緒可用,則首先執行具有最高優先順序的第一個Z觸發器。如果未在觸發器上設定優先順序,則它將使用預設優先順序5,優先順序的值可以是任何整數值,包括正數或者負數。
注意:優先順序僅在觸發器具有相同的啟用時間時才進行比較。定於10:59啟用的觸發器總是在定於11:00啟用的觸發器之前開火。
注意:當檢測到觸發器的作業需要恢復時,其恢復的排程優先順序與原始觸發器相同。
3、Misfire Instructions
觸發器的另一個重要特性是它的“失火指令”。 如果永續性觸發器由於排程程式被關閉而“錯過”其觸發時間,或者因為Quartz.NET的執行緒池中沒有可用於執行作業的執行緒,則會發生失敗。 不同的觸發型別可以使用不同的失火指令。 預設情況下,它們使用“智慧策略”指令 - 該指令具有基於觸發型別和配置的動態行為。 當排程程式啟動時,它會搜尋任何已失效的持久觸發器,然後根據各自配置的失火指令更新每個觸發器。 當您在自己的專案中開始使用Quartz.NET時,您應該熟悉在給定觸發器型別上定義的失火指令,並在其API文件中進行了解釋。 有關失火指令的更多具體資訊將在特定於每種觸發型別的教程課程中給出。
4、Calendars
實現ICalendar介面的Quartz.NET Calendar物件可以在觸發器儲存在排程程式中時與觸發器相關聯。 日曆可用於從觸發器的觸發計劃中排除時間塊。 例如,您可以建立一個觸發器,在每個工作日上午9:30觸發作業,但隨後新增一個排除所有業務假期的日曆。
Calendar可以是任何實現ICalendar介面的可序列化物件,如下所示:
1 namespace Quartz 2 { 3 public interface ICalendar 4 { 5 string Description { get; set; } 6 7 ICalendar CalendarBase { set; get; } 8 9 bool IsTimeIncluded(DateTimeOffset timeUtc); 10 11 DateTime GetNextIncludedTimeUtc(DateTimeOffset timeUtc); 12 13 ICalendar Clone(); 14 } 15 }
儘管日曆物件可以“阻擋”只有一毫秒那麼短的時間段,但很可能,你會對“封鎖”整天的時間感興趣。 為方便起見,Quartz.NET包含了類HolidayCalendar,它就是這樣做的。
必須例項化日曆物件,並通過AddCalendar(..)方法向排程程式註冊日曆物件。如果使用HolidayCalendar,則在例項化它之後,應該使用它的AddExcludedDate(DateTime日期)方法,可以將從排程中排除的天數做引數傳遞給該方法。同一個日曆例項可以與多個觸發器一起使用,例如:
1 HolidayCalendar cal = new HolidayCalendar(); 2 cal.AddExcludedDate(someDate); 3 4 await sched.AddCalendar("myHolidays", cal, false); 5 6 ITrigger t = TriggerBuilder.Create() 7 .WithIdentity("myTrigger") 8 .ForJob("myJob") 9 .WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(9, 30)) // execute job daily at 9:30 10 .ModifiedByCalendar("myHolidays") // but not on holidays 11 .Build(); 12 13 // .. schedule job with trigger 14 15 ITrigger t2 = TriggerBuilder.Create() 16 .WithIdentity("myTrigger2") 17 .ForJob("myJob2") 18 .WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(11, 30)) // execute job daily at 11:30 19 .ModifiedByCalendar("myHolidays") // but not on holidays 20 .Build(); 21 22 // .. schedule job with trigger2
觸發器的構造/構建的細節將在接下來的幾篇文章中給出。 現在,只要相信上面的程式碼建立了兩個觸發器,每個觸發器計劃每天觸發。 但是,將跳過在日曆排除的期間內發生的任何發射。
有關可能滿足您需求的許多ICalendar實現,請參閱Quartz.Impl.Calendar名稱空間。
相關推薦
Quartz.Net進階之二:關於觸發器的更多資訊
與作業一樣,觸發器相對容易使用,但是在您可以充分利用Quartz.NET之前,確實需要了解和理解各種可自定義的選項。 此外,如前所述,您可以選擇不同型別的觸發器來滿足不同的排程需求。 1、常見觸發器屬性(Common Trigger Attributes) 除了所有觸發器型
Quartz.Net進階之三:SimpleTrigger詳述
以前都是將所有的內容放在一篇文章裡,就會導致文章很長,對於學習的人來說,有時候這也是一個障礙。所以,以後我的寫作習慣,我就會把我寫的文章縮短,但是內容不會少,內容更集中。這樣,學習起來也不會很累,很容易看完,也能記得住,不用記得那麼多
Quartz.Net進階之六:詳述 JobStores
一、介紹 今天開始學習 JobStore,別的先不說,也不用翻譯軟體來翻譯,直接從字面意思看來理解一下。我第一眼的感覺就是
Quartz.Net進階之一:初識Job作業和觸發器
前幾天寫了一篇有關Quartz.Net入門的文章,大家感覺不過癮,想讓我在寫一些比較深入的文章。其實這個東西,我也是剛入門,我也想繼續深入瞭解一下,所以就努力看了一些資料,然後自己再整理和翻譯一些,作為學習的歷程,就記錄下來,希望對大家有幫助。一、使用 Quartz(Using Quartz)
翻譯(六)——T-SQL的進階之路:超過基礎的2級水平:寫子查詢
相關 完整 圖像 reg 想要 試驗 releases 驗證 不用 T-SQL的進階之路:超過基礎的2級水平:寫子查詢 格雷戈裏·拉森(Gregory Larsen),2016/01/01(第一次出版:2014/01/29) 該系列 這篇文章是樓梯系列的
年薪500萬Python工程師進階之道:Python就業詳細信息?
image 建議 假設 他會 有一個 北京 詳細信息 process 字符 信息 這是Python程序員或程序員總結the5fire,零門檻的方法進入初級,初級到中級,中級到高級。僅供參考 前言 在小組結束時,基於這個問題,我不喜歡最基本的問題,那就是比較大腦的無情來解決
開發者的進階之路:用語法樹來實現預編譯
能夠 項目 未來 部分 領域 編譯器 提高 cfb ima 如何在保證安全性的前提下,提升開發過程的效率,是每個開發者都在不斷探索的問題。借助語法樹,開發者能夠更好地展現和修改源程序代碼,優化開發環節,提高安全系數,還能進一步實現安卓預編譯。 本文基於個推高級研發工程師李健
ORACLE進階之三:分析函式
有時候我們需要從DB中提取一些很複雜的資料,而標準SQL卻對此無能為力,或者是執行效率非常的低;比如我們需要提取如下資料: 逐行顯示各個部門的累計工資,每行包括部門內前面所有人的工資總和; 查詢各個部門工資最高的前N個人; …… 語法 Function名稱(
薦書 | Netty進階之路:跟著案例學Netty
內容精選自 1000 多個一線業務實際案例真正從原理到實踐全景式講解 Netty 專案實踐快速領
CSS系列——前端進階之路:初涉Less
前言:最近幫一個朋友解決點問題,在檢視元件原始碼的時候涉及到了less語法,這可難倒博主了。沒辦法,既然用到就要學唄,誰讓咱是無所不能的程式猿呢!所以今天來學習下Less,算是筆記,也希望給初學less的園友提供參考,如果你是前端大神,此文就沒必要看了哈。算了,扯遠了哈,進入正題。 一、Less介紹
【2】演算法進階之秩序井然:八大排序
排序演算法可以分為內部排序和外部排序,內部排序是資料記錄在記憶體中進行排序,而外部排序是因排序的資料很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。 常見的內部排序演算法有:插入排序、希爾排序、選擇排序、氣泡排序、歸併排序、快速排序、堆排序、基數排序等。
WPF進階之介面:INotifyPropertyChanged,ICommand
INotifiPropertyChanged 1. 作用:向客戶端發出某一屬性值已更改的通知。該介面包含一個PropertyChanged事件成員(MSDN的解釋) INotifyPropertyChanged 介面用於向客戶端(通常是執行繫結的客戶端)發出某一屬性值已更改的通知。 例如,考慮一個帶有名為
財會小白進階之路:如何在數字化財務時代成為行業大牛?
包括 alt mark 應該 設備 批量 認知 人員 活動 隨著雲技術、流程機器人、認知計算等創新型技術向財務領域不斷的深入,其在帶來組織架構、人員及管理變革的同時,也不禁引起了財會、稅務、審計等人員的困惑,在以機器人技術為牽引的數字化財務時代下,財會人員該如何獲得核心競爭
【SSH進階之路】Hibernate對映——多對一單向關聯對映(四)
【SSH進階之路】Hibernate基本原理(一) ,小編介紹了Hibernate的基本原理以及它的核心,採用物件化的思維操作關係型資料庫。 【SSH進階之路】Hibernate搭建開發環境+簡單例項
Android進階之使用multidex(產生多個dex)解決Dex超出方法數65535的限制
1 概述 1.1 為什麼要拆包 隨著應用不斷迭代,業務線的擴充套件,應用越來越大(比如集成了各種第三方sdk或者公共支援的jar包,專案耦合性高,重複作用的類越來越多),出現了一個 dex 包裝不下的情況,出現65536問題。 1.2 為什麼方法數不能
Unity&Android之二:獲取手機電量資訊、網路狀況
Unity&Android之二:獲取手機電量資訊、網路狀況 遊戲中經常會在UI顯示電量以及網路狀況 手機電量包括: 1、當前正在充電還是放電 2、當前電量值 網路包括: 1、如果是WIFI,WIFI訊號強度 2、如果是流量,訊號強度等資料
.Net異步編程進階之(二)
con mage ack 問題 eth 情況 情況下 core https 避免使用Task.Result和Task.Wait 只有極少方法可以正確的使用Task.Result和Task.Wait,一般情況下建議是完全避免在代碼上出現。 同步異步
效能測試十二:jmeter進階之java請求引數化
如專案中的ip、埠號之類的,都可以在此程式碼中定義 public Arguments getDefaultParameters() { // TODO Auto-generated method stub return null; } 此處註冊兩個引數到jmeter的變
性能測試十二:jmeter進階之java請求參數化
connect apache img success 什麽 個數 rgs java pac 如項目中的ip、端口號之類的,都可以在此代碼中定義 public Arguments getDefaultParameters() { // TODO Auto-gene