ASP.NET Core 使用 Quartz.NET 建立最簡單排程

先使用 NuGet 安裝 Quartz.AspNetCore 套件,或是使用 .NET CLI 執行以下指令安裝:
	
dotnet add package Quartz.AspNetCore
    

建立一個任務,需要實作 IJob 介面,假設叫做 MyJob:
    
using Quartz;


public class MyJob : IJob
{
    public Task Execute(IJobExecutionContext context)
    {
        Console.WriteLine($"Hello World! {DateTime.Now:yyyy-MM-dd HH:mm:ss}");
        
        return Task.CompletedTask;
    }
}
    

在 Program.cs 中註冊任務:
    
using Quartz;
using Quartz.AspNetCore;


var builder = WebApplication.CreateBuilder(args);

builder.Services.AddQuartz(q =>
{
    var jobKey = new JobKey("my-job");
    q.AddJob<MyJob>(j => j
        .StoreDurably()
        .WithIdentity(jobKey)
    );
    q.AddTrigger(t => t
        .ForJob(jobKey)
        .WithCronSchedule("0/5 * * * * ?")
    );
});

builder.Services.AddQuartzServer(options =>
{
    // 等待所有工作結束再關閉
    options.WaitForJobsToComplete = true;
});

var app = builder.Build();
    

上面的 0/5 * * * * ? 是 CRON 表達是,代表從第 0 秒開始,每五秒執行一次,

如果覺得使用 CRON 表達式很麻煩,也可以使用 TimeSpan ,可以很方便切換單位:
    
    q.AddTrigger(t => t
        .ForJob(jobKey)
        .WithSimpleSchedule(schedule => schedule.WithInterval(TimeSpan.FromSeconds(5)).RepeatForever())
    );
    

如果要指定起始時間也可以這樣:
    
    q.AddTrigger(t => t
        .ForJob(jobKey)
        .WithSimpleSchedule(schedule => schedule.WithInterval(TimeSpan.FromSeconds(5)).RepeatForever())
        // 執行的秒數為每分鐘的 00, 05, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55 秒執行
        .WithDailyTimeIntervalSchedule(5, IntervalUnit.Second, x => x
            .OnEveryDay()
            .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(0, 0))
        )
    );
    



參考資料:
Quartz.NET

留言