Quartz 使用调度器前的准备

在能够使用调度器之前,需要先对其进行实例化(这想必不难猜到)。要做到这一点,你需要使用 ISchedulerFactory 接口的一个实现。

一旦调度器被实例化后,就可以启动它、使其进入待机模式或关闭它。请注意,一旦调度器被关闭,如果不重新实例化就无法重启。触发器(以及关联的作业)在调度器启动之前不会触发执行,同样,在调度器处于暂停状态时也不会。

下面是一段快速示例代码,展示了如何实例化并启动一个调度器,并安排一个作业执行:

安装 Quartz.NET NuGet 包

Install-Package Microsoft.Extensions.Hosting
Install-Package Quartz
Install-Package Quartz.Extensions.DependencyInjection
Install-Package Quartz.Extensions.Hosting

配置 Program.cs

使用 Microsoft Hosting 框架配置 Quartz.NET 的一个极简风格示例如下。

using Microsoft.Extensions.Hosting;
using Quartz;

var builder = Host.CreateDefaultBuilder()
    .ConfigureServices((cxt, services) =>
    {
        services.AddQuartz();
        services.AddQuartzHostedService(opt =>
        {
            opt.WaitForJobsToComplete = true;
        });
    }).Build();

// will block until the last running job completes
await builder.RunAsync();

我们给这个例子添加一个作业。


using Microsoft.Extensions.Hosting;
using Quartz;

var builder = Host.CreateDefaultBuilder()
    .ConfigureServices((cxt, services) =>
    {
        services.AddQuartz(q =>
        {
            q.UseMicrosoftDependencyInjectionJobFactory();
        });
        services.AddQuartzHostedService(opt =>
        {
            opt.WaitForJobsToComplete = true;
        });
    }).Build();

var schedulerFactory = builder.Services.GetRequiredService<ISchedulerFactory>();
var scheduler = await schedulerFactory.GetScheduler();

// define the job and tie it to our HelloJob class
var job = JobBuilder.Create<HelloJob>()
    .WithIdentity("myJob", "group1")
    .Build();

// Trigger the job to run now, and then every 40 seconds
var trigger = TriggerBuilder.Create()
    .WithIdentity("myTrigger", "group1")
    .StartNow()
    .WithSimpleSchedule(x => x
        .WithIntervalInSeconds(40)
        .RepeatForever())
    .Build();

await scheduler.ScheduleJob(job, trigger);

// will block until the last running job completes
await builder.RunAsync();

如你所见,使用 Quartz.NET 是相当简单的。在 第 2 课中,我们将快速概述作业和触发器,以便你能更全面地理解这个示例。

传统 Program.cs 结构

如果你正在一个非极简 API 项目中工作,也可以使用传统的 Program.cs 结构。

using Microsoft.Extensions.Hosting;
using Quartz;

namespace Example;

public class Program
{
    public static async Task Main(string[] args) {
        var builder = Host.CreateDefaultBuilder()
            .ConfigureServices((cxt, services) =>
            {
                services.AddQuartz(q =>
                {
                    q.UseMicrosoftDependencyInjectionJobFactory();
                });
                services.AddQuartzHostedService(opt =>
                {
                    opt.WaitForJobsToComplete = true;
                });
            }).Build();

        // will block until the last running job completes
        await builder.RunAsync();
    }
}
在本文档中