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

一. 前奏-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     }

  執行結果:

 

 

 

 

相關文章
相關標籤/搜索