正如標題所示,文章主要是圍繞Quartz.Net做業調度框架話題展開的,內容出自博主學習官方Examples的學習心得與體會,文中不免會有錯誤之處,還請指出得以指教。express
前面瞭解了一些基本觸發器構造做業調度的基礎例子,接下來本篇會學習到關於Cron表達式的觸發器。框架
PS:ICronTrigger觸發器所輪詢的將是無限重複輪詢。ide
一,仍是先來看一下代碼學習
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Common.Logging; using Quartz.Impl; using System.Threading; namespace Quartz.Examples { public class YZRExample2:IExample { #region IExample 成員 public string Name { get { return GetType().Name; } } public void Run() { ILog log = LogManager.GetLogger(typeof(CronTriggerExample)); log.Info("------- 初始化 -------------------"); ISchedulerFactory sf = new StdSchedulerFactory(); IScheduler sched = sf.GetScheduler(); log.Info("------- 初始化 完成 --------"); log.Info("------- 添加調度做業 ----------------"); IJobDetail job = JobBuilder.Create<SimpleJob>() .WithIdentity("job1", "group1") .Build(); ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create() .WithIdentity("trigger1", "group1") .WithCronSchedule("0/30 * * * * ?") .Build(); DateTimeOffset ft = sched.ScheduleJob(job, trigger); log.Info(job.Key + " has been scheduled to run at: " + ft + " and repeat based on expression: " + trigger.CronExpressionString); sched.Start(); log.Info("------- 開始調度進行中 -----------------"); log.Info("------- Waiting five minutes... ------------"); try { // wait five minutes to show jobs Thread.Sleep(300 * 1000); // executing... } catch (ThreadInterruptedException) { } log.Info("------- Shutting Down ---------------------"); sched.Shutdown(true); log.Info("------- Shutdown Complete -----------------"); SchedulerMetaData metaData = sched.GetMetaData(); log.Info(string.Format("Executed {0} jobs.", metaData.NumberOfJobsExecuted)); } #endregion } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Quartz.Examples { using Common.Logging; /// <summary> /// This is just a simple job that gets fired off many times by example 2. /// </summary> /// <author>Bill Kratzer</author> /// <author>Marko Lahma (.NET)</author> public class SimpleJob : IJob { private static readonly ILog log = LogManager.GetLogger(typeof(SimpleJob)); /// <summary> /// Called by the <see cref="IScheduler" /> when a /// <see cref="ITrigger" /> fires that is associated with /// the <see cref="IJob" />. /// </summary> public virtual void Execute(IJobExecutionContext context) { //這個做業演示簡單的打印出做業自己的名稱以及正在運行的日期和時間 JobKey jobKey = context.JobDetail.Key;//做業的名稱 String description=context.JobDetail.Description;//做業的描述 bool durable=context.JobDetail.Durable;//是否持續着 log.InfoFormat("SimpleJob says: {0} executing at {1} and Description is {2} and durable is {3}", jobKey, DateTime.Now.ToString("r"), description,durable); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Quartz.Examples { /// <summary> /// Interface for examples. /// </summary> /// <author>Marko Lahma (.NET)</author> public interface IExample { string Name { get; } void Run(); } }
不管如何,一樣的咱們須要獲得調度實例對象:ui
ISchedulerFactory sf = new StdSchedulerFactory(); IScheduler sched = sf.GetScheduler();
定義做業類:spa
IJobDetail job = JobBuilder.Create<SimpleJob>() .WithIdentity("job1", "group1") .Build();
使用Cron表達式建立Cron觸發器:code
ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create() .WithIdentity("trigger1", "group1") .WithCronSchedule("0/30 * * * * ?") .Build();
特別要記得的是開啓調度:orm
DateTimeOffset ft = sched.ScheduleJob(job, trigger);
sched.Start();
看回去WithCronSchedule("0/30 * * * * ?"), 第一個參數針對是秒數(以空格分隔)
==> 0/30表示:最近一次能夠整除30的點開始(30s,60s),好比你是在25s開啓的,那麼在第30s時候就會觸發,而且每30秒一次,若是你是第35秒開啓的,那麼 在第60s時候會觸發,而且也是30秒一次循環
==> 1/30表示:在0/30的基礎上加多1秒觸發,好比像上面的例子,觸發的時間點是(31s,01s)以此類推,分子表示多加的秒數,分母表示循環週期
==>若是是一個整數,好比15,那麼就是表示每到第15s這個點的時候觸發,能夠指定多個整數,好比0,30,那麼0s(60s),30s這兩個時機會觸發。對象
二:WithCronSchedule分鐘表示blog
將上面tirgger稍微改動一下:
ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create() .WithIdentity("trigger2", "group1") .WithCronSchedule("15 0/1 * * * ?") .Build();
WithCronSchedule("15 0/1 * * * ?") 指每1分鐘的第15s時機觸發
同理,相關用法請看上面解釋。
三:WithCronSchedule時鐘表示
將上面tirgger稍微改動一下:
ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create() .WithIdentity("trigger3", "group1") .WithCronSchedule("0 0/2 8-17 * * ?") .Build();
WithCronSchedule("0 0/2 8-17 * * ?") 小時的表示:
==>8-17這樣的時間段來指定,天天的8-17時每剛滿2分鐘執行一次。
==>10pm這樣指定具體的小時點數,這裏指定下午10點,即下午10點的這個時機觸發。若是要指定一個小時內,好比想在晚上11點到12點以前執行,那麼小時位能夠寫爲23-0(不能寫24)
四:WithCronSchedule日表示
將上面tirgger稍微改動一下:
ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create() .WithIdentity("trigger5", "group1") .WithCronSchedule("0,30 0/1 23-0 1,20 * ?") .Build();
同理,指的就是本月的1號和20號。
五:WithCronSchedule月表示
將上面tirgger稍微改動一下:
ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create() .WithIdentity("trigger5", "group1") .WithCronSchedule("0,30 0/1 23-0 1,20 1 ?") .Build();
六:WithCronSchedule星期表示
將上面tirgger稍微改動一下:
ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create() .WithIdentity("trigger6", "group1") .WithCronSchedule("0,30 * * ? * MON-FRI") .Build();
同理,星期一到星期五觸發。使用逗號就是分別指周幾觸發,好比周末觸發就能夠寫爲:
ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create() .WithIdentity("trigger7", "group1") .WithCronSchedule("0,30 * * ? * SAT,SUN") .Build();