只有累積,沒有奇蹟

2019年4月22日 星期一

[.NETCore] Quartz.NET 初體驗

前言
在 ASP.NET 中常見的排程框架不外乎 Quartz.NET 與 Hangfire 兩種,過去自己在開發上比較常用到 Hangfire 搭配其後台管理介面,在使用上可以說是相當方便與容易上手,最近在新專案也有遇到 schedule 的需求,同事大推 Quartz.Net 來擔任工作排程器的工作,Quartz.Net 是一套功能齊全的工作排程框架,由 Java 熱門的排程框架 Quartz 移植到 .NET 上,open source 且提供彈性的設定讓開發者使用,在新版 3.0.7 支援 .NET Core 2.1 版本,今天就來簡單介紹 Quartz.NET  的安裝與基本應用使用若有問題或是錯誤的地方歡迎各位高手給予指導

安裝
首先,先建立一個名稱為 QuartzNetConsole 的 Console 專案,接著開啟 Nuget Package Mnage 輸入 "quartz" 搜尋,安裝目前最新版的 Quartz.NET 套件
或是在 Nuget Package Console 輸入指令
Install-Package Quartz 
如果有 Json 序列化需求,也可以一併加入 Quartz.Serialization.Json

使用
在使用前先介紹 Quartz.Net 中的幾個重要 API 與 Interface

  • IScheduler  : 主要工作排程 API、透過 Start 方法 run 排程。
  • JobBuilder、IJobDetail : 透過 JobBuilder.Create 產生 IJobDetail 的 Instance。  
  • TriggerBuilder、ITrigger : 透過 TriggerBuilder.Create 產生 ITrigger 的 Instance。   
  • IJob : 自定義的排程類別要實作的 Interface
  • 簡單整理關係圖如下
    接著在 Console 專案 Program 啟動加入下列代碼
    class Program
    {
        static void Main(string[] args)
        {
            // trigger async evaluation
            RunProgram().GetAwaiter().GetResult();
        }
    
        private static async Task RunProgram()
        {
            try
            {
                // 建立 scheduler
                StdSchedulerFactory factory = new StdSchedulerFactory();
                IScheduler scheduler = await factory.GetScheduler();
    
                // 建立 Job
                IJobDetail job = JobBuilder.Create<ShowDataTimeJob>()
                    .WithIdentity("job1", "group1")
                    .Build();
    
                // 建立 Trigger,每秒跑一次
                ITrigger trigger = TriggerBuilder.Create()
                    .WithIdentity("trigger1", "group1")
                    .StartNow()
                    .WithSimpleSchedule(x => x
                        .WithIntervalInSeconds(1)
                        .RepeatForever())
                    .Build();
    
                // 加入 ScheduleJob 中
                await scheduler.ScheduleJob(job, trigger);
    
                // 啟動
                await scheduler.Start();
    
                // 執行 10 秒
                await Task.Delay(TimeSpan.FromSeconds(10));
    
                // say goodbye
                await scheduler.Shutdown();
            }
            catch (SchedulerException se)
            {
                await Console.Error.WriteLineAsync(se.ToString());
            }
        }
    }
    其中要執行的 ShowDataTimeJob 類別代碼如下
    internal class ShowDataTimeJob :IJob
    {
        public async Task Execute(IJobExecutionContext context)
        {
            await Console.Out.WriteLineAsync($"現在時間 {DateTime.Now}");
        }
    }
    程式說明

  • 建立 scheduler : 透過 factory.GetScheduler() 取得 schedule
  • 建立 Job : 使用 JobBuilder.Create 建立 ShowDataTimeJob,並定義其 key 與 group 名稱
  • 建立 Trigger : 使用 TriggerBuilder 建立 ITrigger ,定義其 key 與 group 名稱,並設置立即執行執行時間為每一秒執行一次,其中 ShowDataTimeJob 的 Execute 就是此執行。執行結果如下


  • 感想
    以上透過簡單的說明與操作,就可以快速的 Demo 出 Quartz.NET 工作排程的功能,但其實在現實生活中代碼往往都不會那麼簡單,如果有興趣可以先參考官方網站的開發說明文件,日後如果遇到在分享給各位,Happy Coding :)

    參考
    ASP.NET 程式中的背景工作 (3) - 使用 Quartz.NET
    Quartz.NET Quick Start Guide

    1 則留言:

    Copyright © m@rcus 學習筆記 | Powered by Blogger

    Design by Anders Noren | Blogger Theme by NewBloggerThemes.com