1. 程式人生 > >控制檯基於Quartz.Net元件實現定時任務排程(一)

控制檯基於Quartz.Net元件實現定時任務排程(一)

前言:

   你曾經需要應用執行一個任務嗎?比如現在有一個需求,需要每天在零點定時執行一些操作,那應該怎樣操作呢?

   這個時候,如果你和你的團隊是用.NET程式設計的話,可以考慮使用Quartz.NET排程器。允許開發人員根據日期間隔來實現任務排程任務。非常適合在平時的工作中,定時輪詢資料庫同步,定時郵件通知,定時處理資料等。

   Quartz一個開源的作業排程框架,是OpenSymphony 的 Quartz API的.NET移植每隔,基於C#寫成,可應用於winform、asp.net、asp.net core應用中。提供了巨大的靈活性,是一個更為強大,方便管理,叢集部署的作業排程框架。

所以,有時候專案需要在不同時刻,執行一個或很多個不同的作業,你可以用它來完成執行建立簡單或複雜的任務排程。

導圖:

特性:

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

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

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

概念:

Scheduler        作業排程器

所有的scheduler都應該由SchedulerFactory來建立

 //建立scheduler
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

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

通過實現IJob介面來使你的.NET元件可以很簡單地被scheduler執行

    public class ConsoleJob : IJob
    {
        public Task Execute(IJobExecutionContext context)
        {
            return Console.Out.WriteLineAsync($"執行作業");
        }
    }

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

JobBuilder是一個建造者模式,鏈式建造。通過靜態方法構建一個JobBuilder例項,然後再呼叫類方法Build()建立一個IJobDetail的實現。

public static JobBuilder Create(Type jobType)
{
    JobBuilder b = new JobBuilder();
    b.OfType(jobType);
    return b;
}

TriggerBuilder   根據規則,生產對應的Trigger,觸發器可以規劃執行任務

 

通過靜態方法構建一個TriggerBuilder例項,然後再呼叫類方法Build()建立一個ITrigger的實現。

public static TriggerBuilder Create()
{
    return new TriggerBuilder();
}

 根據任務設定觸發的開始時間和結束時間

    /// <summary>
    /// 開始時間
    /// </summary>
    /// <param name="startTimeUtc"></param>
    /// <returns></returns>
    public TriggerBuilder StartAt(DateTimeOffset startTimeUtc)
    {
        startTime = startTimeUtc;
        return this;
    }
    /// <summary>
    /// 結束時間
    /// </summary>
    /// <param name="endTimeUtc"></param>
    /// <returns></returns>
    public TriggerBuilder EndAt(DateTimeOffset? endTimeUtc)
    {
        endTime = endTimeUtc;
        return this;
    }

步驟:

1、建立一個ISchedulerFactory,然後並且獲取 Scheduler

2、啟動 Scheduler

3、建立 job 任務

4、建立 trigger 觸發器

5、使用觸發器規劃執行任務

開始:

注意:

新建一個Quartz專案後,需要安裝下面的程式包:

你可以用控制檯命令的方式安裝

Install-Package Quartz

也可以使用下面這種方式選擇安裝版本

一、建立一個scheduler的引用:

            ISchedulerFactory schedFact = new StdSchedulerFactory();
            IScheduler sched = await schedFact.GetScheduler();

二、啟動 scheduler:

            await sched.Start();

三、實現IJob:

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

    /// <summary>
    /// 實現IJob,Execute方法裡編寫要處理的業務邏輯
    /// </summary>
    public class ConsoleJob : IJob
    {
        public Task Execute(IJobExecutionContext context)
        {
            return Console.Out.WriteLineAsync($"ConsoleJob執行工作 在當前時間{DateTime.Now}--上一次執行時間:{DateTime.Now.AddSeconds(-5)}");
        }
    }

四、建立trigger:(建立一個某個時間點的觸發器,並且每5秒執行一次)

            ITrigger trigger = TriggerBuilder.Create()
                .WithIdentity("trigger1", "group1")  //觸發器 組
                .WithSimpleSchedule(x => x.WithIntervalInSeconds(5).RepeatForever())
                .Build();

五、觸發器執行任務:

            await sched.ScheduleJob(job, trigger);

將幾個步驟整合後代碼如下:

        /// <summary>
        /// 任務排程的使用過程
        /// </summary>
        /// <returns></returns>
        public async static Task Run()
        {
            // 1.建立scheduler的引用
            ISchedulerFactory schedFact = new StdSchedulerFactory();
            IScheduler sched = await schedFact.GetScheduler();
            

            //2.啟動 scheduler
            await sched.Start();

            // 3.建立 job
            IJobDetail job = JobBuilder.Create<ConsoleJob>()
                    .WithIdentity("job1", "group1")
                    .Build();

            // 4.建立 trigger (建立 trigger 觸發器)
            ITrigger trigger = TriggerBuilder.Create()
                .WithIdentity("trigger1", "group1")  //觸發器 組
                .WithSimpleSchedule(x => x.WithIntervalInSeconds(5).RepeatForever())
                .Build();

            // 5.使用trigger規劃執行任務job (使用觸發器規劃執行任務)
            await sched.ScheduleJob(job, trigger);
        }

執行:

間隔5秒執行一次後的效果:

附加:

這裡使用的quartz為3.x 版本,整個版本相對於2.0版本進行了大量的修改,正式支援了.NET Core 和async/await

引用張隊文章的內容:

總結:

1.其實在實際專案中,可以將上面的方法進行封裝處理,形成不同的任務,特別是處理多工的時候,在不同的job中呼叫不同的trigger,後續會繼續完善開發

2.quartz還有更多的用法,可以參考資料:Quartz.Net官方文件   和  Quartz.Net開源地址

3.專案原始碼