NET作業排程(定時任務)-Quartz.Net

weixin_33806914發表於2016-06-01

一. 背景

工作中我們難免會有這樣一些需求:定時任務,說白了就是在某一時間,讓我們的程式來執行一些工作.
說道這裡,也你會想到windows計劃任務,但在一些時候它並沒有很好的擴充套件性,一些複雜的任務並不能很好的完成,不能滿足的我們的工作需要,我們需要的是一個叢集部署的作業排程框架。

二. Quartz.Net介紹

Quartz.NET是一個開源的作業排程框架,非常適合在平時的工作中,定時輪詢資料庫同步,定時郵件通知,定時處理資料等。 Quartz.NET允許開發人員根據時間間隔(或天)來排程作業。它實現了作業和觸發器的多對多關係,還能把多個作業與不同的觸發器關聯。整合了Quartz.NET的應用程式可以重用來自不同事件的作業,還可以為一個事件組合多個作業.
它一些很好的特性:
1:支援叢集,作業分組,作業遠端管理。
2:自定義精細的時間觸發器,使用簡單,作業和觸發分離。
3:資料庫支援,可以寄宿Windows服務,WebSite,winform等。

三. 實戰

利用nuget來安裝 Quartz.Net
Quartz框架的基礎概念解釋:
Scheduler 作業排程器。
IJob 作業介面,繼承並實現Execute, 編寫執行的具體作業邏輯。
JobBuilder 根據設定,生成一個詳細作業資訊(JobDetail)。
TriggerBuilder 根據規則,生產對應的Trigger

編寫類CronTask.cs 實現IJob,在Execute方法裡編寫要處理的業務邏輯,系統就會按照Quartz的配置,定時處理。

public sealed class CronTask : IJob
{
    private static Logger logger = LogManager.GetCurrentClassLogger();
    public void Execute(IJobExecutionContext context)
    {
        //可以通過context物件來獲取傳遞過來的一些資料資料
        JobDataMap dataMap = context.MergedJobDataMap;
        string tag = dataMap.GetString("tag");
        string title = dataMap.GetString("title");
        string content = dataMap.GetString("content");
        string description = dataMap.GetString("description");
        string tels = dataMap.GetString("tels");
        
        //執行定時任務 傳送簡訊
        SendMsg(tels,content);
        
        context.Scheduler.Shutdown();
        logger.InfoFormat("定時任務測試");
    }
    
    //定義任務
    public static void SetTask(string tag, string starttime, string title, string content, string description,string tels)
    {
        try
        {
            DateTime time = DateTime.Parse(starttime);
            //下面用到的執行時間要使用Cron表示式(如:"/5 * * ? * *"),下面我會介紹一下
            string cronstr = GetCron(time);
            //從工廠中獲取一個排程器例項化
            IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
            scheduler.Start();
            var jobData = new JobDataMap();
            jobData.Add("tag", tag);
            jobData.Add("title", title);
            jobData.Add("content", content);
            jobData.Add("description", description);
            jobData.Add("tels", tels);
            IJobDetail job = JobBuilder.Create<CronTask>()
                            .WithIdentity("job", DateTime.Now.ToLongDateString())
                            .SetJobData(jobData)
                            .Build();
            ITrigger trigger = TriggerBuilder.Create()
                                        .WithIdentity("msmtriger", "group")
                                        .StartNow()                        //現在開始
                                        .WithCronSchedule(cronstr)
                                        .Build();
                                        
            //                  ITrigger trigger2 = TriggerBuilder.Create()
            //                      .WithIdentity("mytrigger", "group1")
            //                      .StartNow()
            //                      .WithCronSchedule("/5 * * ? * *")    //時間表示式,5秒一次     
            //                      .Build();                            
                                        
            scheduler.ScheduleJob(job, trigger);//把作業,觸發器加入排程器。
        }
        catch (Exception ex)
        {
            logger.Error(ex);
        }
    }
    
    public static string GetCron(DateTime dt)
    {
        string retulut = "";
        retulut = string.Format("0,{0} 0,{1} 0,{2} {3} {4} ? {5}", dt.Second, dt.Minute, dt.Hour, dt.Day, dt.Month, dt.Year);
        return retulut;
    }
    
}

WithCronSchedule("") 擁有強大的Cron時間表示式,正常情況下WithSimpleSchedule(x) 已經滿足大部分對日期設定的要求了。
上面說道的cron表示式可以參考:
http://www.cnblogs.com/yanweidie/p/3537144.html

裡面的線上地址已經不能用了,我這裡給大家準備了一個:
Quartz Cron表示式線上生成器

相關文章