Quartz.NET中Job和Trigger的常用方法

 

Quartz.NET作爲一款定時任務框架,它的最小可運行程序如下:

    var scheduler = StdSchedulerFactory.GetDefaultScheduler();

    scheduler.Start();

    //Job執行的任務
    var job = JobBuilder.Create<MyJob>().Build();

    //Schedule計劃表,可以設置調用次數,調用間隔
    //Trigger觸發器,可以設置調用開始,結束時間,優先級
    var trigger = TriggerBuilder.Create().WithSimpleSchedule(
                                         m => m.WithIntervalInSeconds(1).WithRepeatCount(1))
                                        .StartNow()//.EndAt(DateTimeOffset.Now.AddSeconds(10))
                                        .Build();

    scheduler.ScheduleJob(job, trigger);

 

它有兩個核心要素:Job和Trigger,Job用於通過實現了IJob接口的泛型即PublishJob告訴框架做什麼,而Trigger告訴框架何時做。

MyJob類:

    /// <summary>
    /// 自定義任務
    /// </summary>
    public class MyJob : IJob
    {
        public void Execute(IJobExecutionContext context)
        {
            //實現具體的業務邏輯
        }
    }

Job常用方法

UsingJobData(key, value)方法

通過這個方法可以給具體的任務實現類即上面的MyJob傳值,例如: context.JobDetail.JobDataMap["count"]

 

WithDescription(description)方法

用於描述Job的名稱,業務邏輯,我一開始還很奇怪任務的名稱和業務邏輯完全可以在代碼中描述,爲何還要有這個方法,原來這個方法的使用場景是:自定義定時任務框架,比如開發一套類似於Windows定時任務的工具。

 

WithIdentity(name)

給JobKey命名,JobKey是JobBuilder的一個屬性,它的底層代碼如下:

    public JobBuilder WithIdentity(string name)
    {
        //new一個JobKey,name是key的名稱,group名稱是null
        key = new JobKey(name, null);
        return this;
    }

 

StoreDurably(durability)

是否持久化(默認當沒有Trigger指向Job時,Job會被刪掉)

 

SetJobData(newJobDataMap)

給JobDataMap設置一個新的對象,這個方法與上面的UsingJobData方法區別在於一個是給JobDataMap添加值,一個是重新給這個對象賦值,它們的底層代碼如下。

SetJobData:


        public JobBuilder SetJobData(JobDataMap newJobDataMap)
        {
            jobDataMap = newJobDataMap;
            return this;
        }

 

UsingJobData:

        public JobBuilder UsingJobData(string key, string value)
        {
            jobDataMap.Put(key, value);
            return this;
        }

 

Trigger常用方法

StartAt(startTimeUtc) 方法

設置觸發器開始執行的時間,這個參數是可以設置時區的。

Quartz.NET框架自身還封裝了一個日期工具類DateBuilder,它實現類很多返回下一分鐘(小時,天等)方法,它與StartAt能夠很好地配合。

例如:

DateBuilder.EvenMinuteDateAfterNow(); 返回現在時刻地下一分鐘,例如:現在的時間是12點29分20秒,它會返回12點30分00秒

 

EndAt(endTimeUtc) 方法

與StartAt對應的是EndAt方法,它用於設置觸發器的關閉時間

 

WithSimpleSchedule(action) 方法

創建了一個簡單的執行計劃,可以設置執行次數,頻率等,這個方法是最常用的,我們熟悉的Timer定時器就類似於這個。

它的參數是一個委託Action<SimpleScheduleBuilder>,我們就是通過調用SimpleScheduleBuilder的方法來設置執行次數&間隔時間的。

 

WithDailyTimeIntervalSchedule(action) 方法

創建一個功能更強的執行計劃,它可以設置每天幾點到幾點執行,工作日執行或只在週末執行,在執行了幾次後停止,在某一個星期執行,設置執行頻率等。

它的參數是一個委託Action<DailyTimeIntervalScheduleBuilder>,我們就是通過調用DailyTimeIntervalScheduleBuilder的方法來設置執行策略的。

 

WithCronSchedule(cronExpression)方法

通過Corn表達式來設置執行計劃,這種方式與上面兩種的優點在於我們可以不再通過硬編碼的方式來設置執行策略,而是通過字符串來控制執行策略。

語法如下:

        //秒 分 時 天 月 年 周
        //1. 天或者周必須有一個是?(?表示模糊)
        //2. * 表示所有值即,秒位爲*表示每秒執行一次
        //3. - 表示範圍,分鐘位爲10-12表示每個小時的10,11,12分執行一次
        //4. , 表示每個值即,分鐘位爲10,20,30表示每個小時的10,20,30分執行一次
        //5. / 表示遞增,秒位爲0/5表示0,5,10,15,20,25,30,35,40,45,50,55秒執行一次
        //例子:
        // * * * * * ?       => 每秒執行一次
        // 0/5 * * * * ?   => 5s執行一次
        // 0 * * * * ?       => 1min執行一次
        // 0 0 1 * * ?       => 每個月1號執行一次
        // 地址:https://www.quartz-scheduler.net/documentation/quartz-2.x/tutorial/crontrigger.html

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章