Net作業排程(一) -Quartz.Net入門

蘑菇先生發表於2014-11-01

背景

很多時候,專案需要在不同時刻,執行一個或很多個不同的作業。

Windows執行計劃這時並不能很好的滿足需求了,迫切需要一個更為強大,方便管理,叢集部署的作業排程框架。

介紹

Quartz一個開源的作業排程框架,OpenSymphony的開源專案。Quartz.Net 是Quartz的C#移植版本。

它一些很好的特性:

1:支援叢集,作業分組,作業遠端管理。 

2:自定義精細的時間觸發器,使用簡單,作業和觸發分離。

3:資料庫支援,可以寄宿Windows服務,WebSite,winform等。

實戰

Quartz框架的一些基礎概念解釋:

   Scheduler     作業排程器。

   IJob             作業介面,繼承並實現Execute, 編寫執行的具體作業邏輯。

  JobBuilder       根據設定,生成一個詳細作業資訊(JobDetail)。

  TriggerBuilder   根據規則,生產對應的Trigger

Nuget安裝 

 PM> Install-Package Quartz 

下面是簡單使用例子,附帶詳細的註釋:

 static void Main(string[] args)
        {
            //從工廠中獲取一個排程器例項化
            IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();

            scheduler.Start();       //開啟排程器

            //==========例子1(簡單使用)===========

            IJobDetail job1 = JobBuilder.Create<HelloJob>()  //建立一個作業
                .WithIdentity("作業名稱", "作業組")
                .Build();

            ITrigger trigger1 = TriggerBuilder.Create()
                                        .WithIdentity("觸發器名稱", "觸發器組")
                                        .StartNow()                        //現在開始
                                        .WithSimpleSchedule(x => x         //觸發時間,5秒一次。
                                            .WithIntervalInSeconds(5)
                                            .RepeatForever())              //不間斷重複執行
                                        .Build();


            scheduler.ScheduleJob(job1, trigger1);      //把作業,觸發器加入排程器。

            //==========例子2 (執行時 作業資料傳遞,時間表示式使用)===========

            IJobDetail job2= JobBuilder.Create<DumbJob>()
                                        .WithIdentity("myJob", "group1")
                                        .UsingJobData("jobSays", "Hello World!")
                                        .Build();


            ITrigger trigger2 = TriggerBuilder.Create()
                                        .WithIdentity("mytrigger", "group1")
                                        .StartNow()
                                        .WithCronSchedule("/5 * * ? * *")    //時間表示式,5秒一次      
                                        .Build();


            scheduler.ScheduleJob(job2, trigger2);      
         
            //scheduler.Shutdown();         //關閉排程器。
        }

宣告要執行的作業,HelloJob:

 /// <summary>
    /// 作業
    /// </summary>
    public class HelloJob : IJob
    {
        public void Execute(IJobExecutionContext context)
        {
            Console.WriteLine("作業執行!");
        }
    }

宣告要執行的作業,DumbJob:

public class DumbJob : IJob
    {
        /// <summary>
        ///  context 可以獲取當前Job的各種狀態。
        /// </summary>
        /// <param name="context"></param>
        public void Execute(IJobExecutionContext context)
        {

            JobDataMap dataMap = context.JobDetail.JobDataMap;

            string content = dataMap.GetString("jobSays");

            Console.WriteLine("作業執行,jobSays:" + content);
        }
    } 

 

其WithCronSchedule("") 擁有強大的Cron時間表示式,正常情況下WithSimpleSchedule(x) 已經滿足大部分對日期設定的要求了。

Quartz.Net官方2.X教程  http://www.quartz-scheduler.net/documentation/quartz-2.x/tutorial/index.html

Quartz.Net開源地址   https://github.com/quartznet/quartznet

相關文章