一. 前奏-Timer類實現定時任務編程
在沒有引入第三方開源的定時調度框架以前,咱們處理一些簡單的定時任務同時都是使用Timer類, DotNet中的Timer類有三個,分別位於不一樣的命名空間下,分別是:框架
①.位於System.Windows.Forms裏,即定時器控件,不過多介紹了函數
②.位於System.Threading.Timer類裏 (重點介紹)ui
③.位於System.Timers.Timer類裏 (不介紹)spa
下面重點介紹第二種,位於Threading下面的Timer類,觀察其源碼,發現有多種構造函數,咱們重點介紹其中的一種。線程
分享一段代碼:2秒後開啓該線程,而後每隔4s調用一次。日誌
1 //2秒後開啓該線程,而後每隔4s調用一次 2 System.Threading.Timer timer = new System.Threading.Timer((n) => 3 { 4 //書寫業務邏輯 5 Console.WriteLine("我是定時器中的業務邏輯哦{0}",n); 6 }, "1", 2000, 4000);
分析總結:上面的代碼顯而易見,只能控制:延遲多久開始執行,每隔多久執行一次,至於執行多少次、什麼時間關閉均沒法實現,更不用說處理一些複雜的時間間隔了,因此Timer類僅僅適合處理對時間要求很是簡單的定時任務。code
二. 進入主題-Quartz.Net的入門使用orm
使用步驟: blog
前提:經過NuGet引入程序集或者直接下載源碼進行引入,而後分五步走。
步驟一:建立做業調度池(Scheduler)
步驟二:建立一個具體的做業即job (具體的job須要單獨在一個文件中執行)
步驟三:建立並配置一個觸發器即trigger
步驟四:將job和trigger加入到做業調度池中
步驟五:開啓調度
下面分享一段簡單的代碼(當即執行、每隔一秒執行一次、永久執行)
1 /// <summary> 2 /// Quartz框架的使用 3 /// </summary> 4 public static void Show() 5 { 6 //1.建立做業調度池(Scheduler) 7 IScheduler scheduler =StdSchedulerFactory.GetDefaultScheduler(); 8 9 //2.建立一個具體的做業即job (具體的job須要單獨在一個文件中執行) 10 var job = JobBuilder.Create<HelloJob>().Build(); 11 12 //3.建立並配置一個觸發器即trigger 1s執行一次 13 var trigger = TriggerBuilder.Create().WithSimpleSchedule(x => x.WithIntervalInSeconds(1) 14 .RepeatForever()).Build(); 15 //4.將job和trigger加入到做業調度池中 16 scheduler.ScheduleJob(job, trigger); 17 18 //5.開啓調度 19 scheduler.Start(); 20 }
1 /// <summary> 2 /// 實現IJob接口 3 /// </summary> 4 class HelloJob : IJob 5 { 6 void IJob.Execute(IJobExecutionContext context) 7 { 8 Console.WriteLine("Hellow JOB"); 9 } 10 }
分析:每一個Job都須要實現IJob接口,而且顯式的實現Execute方法;建立調度器除了上述方法外,還能夠:
1 //另一種建立調度池的方法 2 var factory = new StdSchedulerFactory(); 3 IScheduler scheduler2 = factory.GetScheduler();
執行結果:
三. 擴展-Aop思想的體現
咱們想在每次Job執行的先後,分別執行一段通用的業務,但有不想和原業務寫在一塊兒,這個時候就須要面向切面編程了,即AOP思想的體現。
Quartz.Net中Aop思想經過JobListener來實現,代碼以下:
1 /// <summary> 2 /// Quartz中的AOP思想 3 /// </summary> 4 public static void AopShow() 5 { 6 //1.建立Schedule 7 IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler(); 8 9 //2.建立job (具體的job須要單獨在一個文件中執行) 10 var job = JobBuilder.Create<HelloJob>().Build(); 11 12 //3.配置trigger 1s執行一次 13 var trigger = TriggerBuilder.Create().WithSimpleSchedule(x => x.WithIntervalInSeconds(1) 14 .RepeatForever()).Build(); 15 //AOP配置 16 scheduler.ListenerManager.AddJobListener(new MyAopListener(), GroupMatcher<JobKey>.AnyGroup()); 17 18 //4.將job和trigger加入到做業調度池中 19 scheduler.ScheduleJob(job, trigger); 20 21 //5. 開始調度 22 scheduler.Start(); 23 } 24 /// <summary> 25 /// Aop類 26 /// </summary> 27 public class MyAopListener : IJobListener 28 { 29 public string Name 30 { 31 get 32 { 33 return "hello world"; 34 } 35 } 36 public void JobExecutionVetoed(IJobExecutionContext context) 37 { 38 39 } 40 public void JobToBeExecuted(IJobExecutionContext context) 41 { 42 Console.WriteLine("執行前寫入日誌"); 43 } 44 public void JobWasExecuted(IJobExecutionContext context, JobExecutionException jobException) 45 { 46 Console.WriteLine("執行後寫入日誌"); 47 } 48 }
執行結果: