第一節: Timer的定時任務的復習、Quartz.Net的入門使用、Aop思想的體現


一. 前奏-Timer類實現定時任務

   在沒有引入第三方開源的定時調度框架之前,我們處理一些簡單的定時任務同時都是使用Timer類, DotNet中的Timer類有三個,分別位於不同的命名空間下,分別是:

    ①.位於System.Windows.Forms里,即定時器控件,不過多介紹了

    ②.位於System.Threading.Timer類里 (重點介紹)

    ③.位於System.Timers.Timer類里 (不介紹)

  下面重點介紹第二種,位於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類僅僅適合處理對時間要求非常簡單的定時任務。

 

二. 進入主題-Quartz.Net的入門使用

使用步驟:

  前提:通過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     }

  執行結果:

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM