只有累積,沒有奇蹟

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 輸入指令
  1. 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 啟動加入下列代碼
    1. class Program
    2. {
    3. static void Main(string[] args)
    4. {
    5. // trigger async evaluation
    6. RunProgram().GetAwaiter().GetResult();
    7. }
    8.  
    9. private static async Task RunProgram()
    10. {
    11. try
    12. {
    13. // 建立 scheduler
    14. StdSchedulerFactory factory = new StdSchedulerFactory();
    15. IScheduler scheduler = await factory.GetScheduler();
    16.  
    17. // 建立 Job
    18. IJobDetail job = JobBuilder.Create<ShowDataTimeJob>()
    19. .WithIdentity("job1", "group1")
    20. .Build();
    21.  
    22. // 建立 Trigger,每秒跑一次
    23. ITrigger trigger = TriggerBuilder.Create()
    24. .WithIdentity("trigger1", "group1")
    25. .StartNow()
    26. .WithSimpleSchedule(x => x
    27. .WithIntervalInSeconds(1)
    28. .RepeatForever())
    29. .Build();
    30.  
    31. // 加入 ScheduleJob 中
    32. await scheduler.ScheduleJob(job, trigger);
    33.  
    34. // 啟動
    35. await scheduler.Start();
    36.  
    37. // 執行 10 秒
    38. await Task.Delay(TimeSpan.FromSeconds(10));
    39.  
    40. // say goodbye
    41. await scheduler.Shutdown();
    42. }
    43. catch (SchedulerException se)
    44. {
    45. await Console.Error.WriteLineAsync(se.ToString());
    46. }
    47. }
    48. }
    其中要執行的 ShowDataTimeJob 類別代碼如下
    1. internal class ShowDataTimeJob :IJob
    2. {
    3. public async Task Execute(IJobExecutionContext context)
    4. {
    5. await Console.Out.WriteLineAsync($"現在時間 {DateTime.Now}");
    6. }
    7. }
    程式說明

  • 建立 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

    Related Posts:

    • [NETCore] ASP.NET Core 建立排程服務 - 使用 Generic Host 搭配 Quartz.Net - Part 1前言 最近有個需求是固定時間取得特定資料進行修改,在查詢相關資料之後決定使用 ASP.NET Core Generic Host 為出發,在搭配 .NET 中熱門的排程套件 Quartz.Net,測試完畢之後再將程式註冊為 Windows Service 服務就可滿足使用者的需求,這篇文章是整理開發時的重點流程為系列文,給有需要使用 ASP.NET Core 開發排程相關應用程式需求的朋友一些參考,若有問題或是錯誤的地方歡迎各位高手給予… Read More
    • [.NET] Quartz.NET 排程執行異常 - All triggers of Job class set to ERROR state. 問題  最近因為新專案需求是定期到資料庫檢查會員的資料,因此使用 ASP.NET Core Hosting 服務 +  Quartz.NET 作為工作排程器使用,在開發完畢要啟動 Job 驗證正確性時意外跳出異常訊息,錯誤訊息為  Quartz.Simpl.RAMJobStore | All triggers of Job GroupName.ClassName set to ERROR state.&nb… Read More
    • [NETCore] ASP.NET Core 建立排程服務 - 使用 Generic Host 搭配 Quartz.Net - Part 2前言 這是 ASP.NET Core 建立排程服務 - 使用 Generic Host 搭配 Quartz.Net 系列文第二篇,這系列文的目標是使用 ASP.NET Core Generic Host 搭配排程套件 Quartz.Net,程式註冊為 Windows Service 服務執行, 在上一篇介紹了在 main 方法中建立 HostBuilder 並加入 TimeHostedService 執行,這一篇是重點是在 A… Read More
    • [.NETCore] Quartz.NET 初體驗前言 在 ASP.NET 中常見的排程框架不外乎 Quartz.NET 與 Hangfire 兩種,過去自己在開發上比較常用到 Hangfire 搭配其後台管理介面,在使用上可以說是相當方便與容易上手,最近在新專案也有遇到 schedule 的需求,同事大推 Quartz.Net 來擔任工作排程器的工作,Quartz.Net 是一套功能齊全的工作排程框架,由 Java 熱門的排程框架 Quartz 移植到 .NET 上,ope… Read More
    • [NETCore] ASP.NET Core 建立排程服務 - 使用 Generic Host 搭配 Quartz.Net - Part 3前言 這是 ASP.NET Core 建立排程服務 - 使用 Generic Host 搭配 Quartz.Net 系列文第三篇,這系列文的目標是使用 ASP.NET Core Generic Host 搭配排程套件 Quartz.Net,程式註冊為 Windows Service 服務執行, 第一篇介紹了 Gereric Host 泛型主機的基本設定,第二篇介紹 ASP.NET Core 與 Quartz.Net 的整合,接下來這一篇… Read More

    1 則留言:

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

    Design by Anders Noren | Blogger Theme by NewBloggerThemes.com