控制台基於Quartz.Net組件實現定時任務調度(一)

来源:https://www.cnblogs.com/i3yuan/archive/2019/08/10/11332931.html
-Advertisement-
Play Games

前言: 你曾經需要應用執行一個任務嗎?比如現在有一個需求,需要每天在零點定時執行一些操作,那應該怎樣操作呢? 這個時候,如果你和你的團隊是用.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.項目源碼地址


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 時隔一年多,在掌握了Spring、SpringBoot、SpringCloud之後 我再次回頭,重新學習Spring框架 Bean的生命周期學習: 在傳統的XML配置中,可以這樣自定義初始化和銷毀方法: 註解方式的簡單使用: 註意:要有close方法,否則不會列印Car銷毀方法 列印如下: 這裡預設 ...
  • 快速排序:在一組數據中,可以將左邊的數字當作樞軸(右邊也可以),接下來要做的就是,先從右邊找到比樞軸小的數, 再從左邊找到比樞軸大的數,接著將這兩個數進行交換,重覆上述步驟找出所有符合條件的數進行交換, 最後將樞軸放到比樞軸大的數與比樞軸小的數之間。之所以要從右邊開始找,並且找到比樞軸小的數是因為交 ...
  • 原題 | Generating a PEG Parser 作者 | Guido van Rossum(Python之父) 譯者 | 豌豆花下貓(“Python貓”公眾號作者) 聲明 | 本翻譯是出於交流學習的目的,基於 "CC BY NC SA 4.0" 授權協議。為便於閱讀,內容略有改動。 首發地 ...
  • 更新一篇知識星球裡面的源碼分析文章,去年寫的,周末自己錄了個視頻,大家看下效果好嗎?如果好的話,後面補錄發在知識星球裡面的其他源碼解析文章。 前言 之前自己本地 clone 了 Flink 的源碼,編譯過,然後 share 到了 GitHub 上去了,自己也寫了一些源碼的中文註釋,並且 push 到 ...
  • debug #排除程式故障 print()函數常和#號註釋結合在一起用來debug 多行註釋有兩種快捷操作:1、在需要註釋的多行代碼塊前後加一組三引號''' 2、選中代碼後使用快捷鍵操作:Windows快捷鍵是ctrl+/,Mac為cmd+/,適用於本地編輯器) 一種異常處理的機制,可以在異常出現時 ...
  • 一、補碼簡介 1.電腦中的符號數有三種表示方式,即為:原碼、反碼、補碼。三種表示方法均有符號位和數值位,符號位都是0表示正數,符號位都是1表示負數。 2.電腦中的數字的存儲方式:在電腦系統中,數值一律用補碼來表示和存儲,原因在於:使用補碼可以將符號位和數值域統一處理,同時,加法和減法可以統一處 ...
  • 1.JMS即Java消息服務,是Java平臺中面向消息中間件的API,用於在兩個應用程式之間,或分散式系統中發送消息,進行非同步通信。 2.JMS分為兩種,點對點消息模型 和發佈/訂閱消息模型 3.由六個模塊組成 連接工廠ConnectFactory 消息隊列的連接Connect 用於連接的對話Ses ...
  • 非同步流(AsyncStream) 原文地址: "https://github.com/dotnet/roslyn/blob/master/docs/features/async streams.md" 註意:以下內容最好能根據反編譯工具查看非同步流相關類生成的代碼效果最佳 非同步流是可枚舉類(Enume ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...