前言
在 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
简单整理关係图如下
.png)]
接著在 Console 专案 Program.cs
中的 Main
加入下列代码
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
就是此执行。执行结果如下:
感想
上透过简单的说明与操作,就可以快速的建立出 Quartz.NET
工作排程的功能,但其实在现实生活中的需求及实现的代码往往都不会那麽简单,如果有兴趣可以先参考官方网站的开发说明文件,日后如果遇到在分享给各位,Happy Coding 😃。
另外,Quartz.Net
也能搭配其他套件将设定档设定 XML 档中,甚至也能将够搭配一点手做精神,手刻一些代码后将设定档放置在 YAML 档中,方便配置。此外,JOB 的定义及执行的週期也能够透过安装其它套件,将其存放在 SQL Server 或是 Redis
中,得到更弹性的配置。又或者,能够像设定档一下放置在 YAML 档案中。