介紹
前面介紹Quartz.Net的基本用法,但在實際應用中,往往有更多的特性需求,比如記錄job執行的執行歷史,發郵件等。
閱讀目錄
- Quartz.Net外掛
- TriggerListener,JobListener
- Cron表示式
- Quartz.Net執行緒池
- 總結
Quartz.Net外掛
Quartz.net 自身提供了一個外掛介面(ISchedulerPlugin)用來增加附加功能,看下官方定義:
public interface ISchedulerPlugin { void Initialize(string pluginName, IScheduler sched); //關閉排程器 void Shutdown(); //外掛啟動 void Start(); }
繼承介面,實現自己的外掛。
public class MyPlugin : ISchedulerPlugin { public void Initialize(string pluginName, IScheduler sched) { Console.WriteLine("例項化"); } public void Start() { Console.WriteLine("啟動"); } public void Shutdown() { Console.WriteLine("關閉"); } }
主函式裡面配置要實現的外掛,註釋部分,一句話搞定。
static void Main(string[] args) { var properties = new NameValueCollection(); //MyPlugin 自定義名稱。 "名稱空間.類名,程式名稱" properties["quartz.plugin.MyPlugin.type"] = "QuartzDemo3.MyPlugin,QuartzDemo3"; var schedulerFactory = new StdSchedulerFactory(properties); var scheduler = schedulerFactory.GetScheduler(); var job = JobBuilder.Create<HelloJob>() .WithIdentity("myJob", "group1") .Build(); var trigger = TriggerBuilder.Create() .WithIdentity("mytrigger", "group1") .WithCronSchedule("/2 * * ? * *") .Build(); scheduler.ScheduleJob(job, trigger); scheduler.Start(); Thread.Sleep(6000); scheduler.Shutdown(true); Console.ReadLine(); }
執行結果如下:
TriggerListener,JobListener
這2個是對觸發器和job本身的行為監聽器,這樣更好方便跟蹤Job的狀態及執行情況。
ITriggerListener是官方定義的介面,這裡我們直接繼承實現。
public class MyTriggerListener : ITriggerListener { private string name; public void TriggerComplete(ITrigger trigger, IJobExecutionContext context, SchedulerInstruction triggerInstructionCode) { Console.WriteLine("job完成時呼叫"); } public void TriggerFired(ITrigger trigger, IJobExecutionContext context) { Console.WriteLine("job執行時呼叫"); } public void TriggerMisfired(ITrigger trigger) { Console.WriteLine("錯過觸發時呼叫(例:執行緒不夠用的情況下)"); } public bool VetoJobExecution(ITrigger trigger, IJobExecutionContext context) { //Trigger觸發後,job執行時呼叫本方法。true即否決,job後面不執行。 return false; } public string Name { get { return name; } set { name = value; } } }
主函式新增:
//新增監聽器到指定的trigger scheduler.ListenerManager.AddTriggerListener(myJobListener, KeyMatcher<TriggerKey>.KeyEquals(new TriggerKey("mytrigger", "group1"))); ////新增監聽器到指定分類的所有監聽器。 //scheduler.ListenerManager.AddTriggerListener(myJobListener, GroupMatcher<TriggerKey>.GroupEquals("myJobGroup")); ////新增監聽器到指定分類的所有監聽器。 //scheduler.ListenerManager.AddTriggerListener(myJobListener, GroupMatcher<TriggerKey>.GroupEquals("myJobGroup")); ////新增監聽器到指定的2個分組。 //scheduler.ListenerManager.AddTriggerListener(myJobListener, GroupMatcher<TriggerKey>.GroupEquals("myJobGroup"), GroupMatcher<TriggerKey>.GroupEquals("myJobGroup2")); ////新增監聽器到所有的觸發器上。 //scheduler.ListenerManager.AddTriggerListener(myJobListener, GroupMatcher<TriggerKey>.AnyGroup()); scheduler.Start();
JobListener同理,這裡不多做描述。
Cron表示式
quartz中的cron表示式和Linux下的很類似,比如 "/5 * * ? * * *" 這樣的7位表示式,最後一位年非必選。
表示式從左到右,依此是秒、分、時、月第幾天、月、周幾、年。下面表格是要遵守的規範:
欄位名 | 允許的值 | 允許的特殊字元 |
---|---|---|
Seconds | 0-59 | , - * / |
Minutes | 0-59 | , - * / |
Hours | 0-23 | , - * / |
Day of month | 1-31 | , - * ? / L W |
Month | 1-12 or JAN-DEC | , - * / |
Day of week | 1-7 or SUN-SAT | , - * ? / L # |
Year | 空, 1970-2099 | , - * / |
特殊字元 | 解釋 |
, | 或的意思。例:分鐘位 5,10 即第5分鐘或10分都觸發。 |
/ | a/b。 a:代表起始時間,b頻率時間。 例; 分鐘位 3/5, 從第三分鐘開始,每5分鐘執行一次。 |
* | 頻率。 即每一次波動。 例;分鐘位 * 即表示每分鐘 |
- | 區間。 例: 分鐘位 5-10 即5到10分期間。 |
? | 任意值 。 即每一次波動。只能用在DayofMonth和DayofWeek,二者衝突。指定一個另一個一個要用? |
L | 表示最後。 只能用在DayofMonth和DayofWeek,4L即最後一個星期三 |
W | 工作日。 表示最後。 只能用在DayofWeek |
# | 4#2。 只能用DayofMonth。 某月的第二個星期三 |
例項介紹
”0 0 10,14,16 * * ?" 每天10點,14點,16點 觸發。
"0 0/5 14,18 * * ?" 每天14點或18點中,每5分鐘觸發 。
"0 4/15 14-18 * * ?" 每天14點到18點期間, 從第四分鐘觸發,每15分鐘一次。
"0 15 10 ? * 6L" 每月的最後一個星期五上午10:15觸發。
Quartz.Net執行緒池
執行緒池數量設定:
properties["quartz.threadPool.threadCount"] = "5";
這個執行緒池的設定,是指同時間,排程器能執行Job的最大數量。
quartz是用每個執行緒跑一個job。上面的設定可以解釋是job併發時能執行5個job,剩下的job如果觸發時間恰好到了,當前job會進入暫停狀態,直到有可用的執行緒。
如果在指定的時間範圍依舊沒有可用執行緒,會觸發misfired時間。
quartz 提供了IThreadPool介面,也可以用自定義執行緒池來實現。
配置如下:
properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz";
一般來說作業排程很少併發觸發大量job,如果有上百個JOB,可在伺服器承受範圍內適量增加執行緒數量。
總結
官方有LoggingTriggerHistoryPlugin,LoggingJobHistoryPlugin 已實現的,觸發器和job歷史記錄的外掛。
Quartz.Plugin 名稱空間下有官方實現的其他一些外掛,也可以自己增加擴充套件。
quartz中監聽器還有SchedulerListener,使用方法基本一樣。
本文基於自用經驗和官方文件程式碼來寫的,部分是直接翻譯的。
Quartz.Net官方教程http://www.quartz-scheduler.net/documentation/quartz-2.x/tutorial/index.html