Quartz.AspNetCore 集成包

Quartz.AspNetCore 提供了与 ASP.NET Core 托管服务 的集成。

提示 如果你只需要通用主机,通用主机集成可能就足够了。

安装

你需要在使用 Quartz 的项目中添加 NuGet 包引用。

Install-Package Quartz.AspNetCore

使用

你可以通过在 IServiceCollection 上调用扩展方法 AddQuartzServer 来添加 Quartz 配置。这将在 ASP.NET Core 进程中添加一个托管的 Quartz 服务器,该服务器将根据应用程序的生命周期启动和停止。

提示 查看 Quartz.Extensions.DependencyInjection 文档 以了解更多关于配置 Quartz 调度器、作业和触发器的信息。

Startup.ConfigureServices 配置示例

public void ConfigureServices(IServiceCollection services)
{
    services.AddQuartz(q =>
    {
        // 基础 Quartz 调度器、作业和触发器的配置
    });

    // ASP.NET Core 托管服务配置
    services.AddQuartzServer(options =>
    {
        // 关闭时我们希望作业能优雅完成
        options.WaitForJobsToComplete = true;
    });
}

实际设置示例

以下代码展示了一个 Quartz 包在 ASP.NET Core MVC 中的实际应用。

为了更好地说明 Quartz 库的使用,假设你有一个在选择 MVC 架构时始终创建的 Program.cs 文件,然后想象一个 Jobs 文件夹,其中包含了所有你想让 Quartz 在运行 Web 应用程序时在后台执行的任务。

之后,操作就相当直接了。在 Jobs 文件夹中,创建一个类来执行你指定的任务。这个类应该扩展 IJob 接口并实现 Execute 方法。

SendEmailJob.cs 配置示例

public class SendEmailJob : IJob
{
    public Task Execute(IJobExecutionContext context)
    {
        // 发送周期性邮件给用户(例如)的代码
        // 注意:此方法必须总是返回一个值
        // 对于监视作业执行的触发监听器来说尤为重要
        return Task.CompletedTask;
    }
}

之后,你只需在 Program.cs 中构建 Quartz 触发器,以确保作业按照预设的间隔运行。

Program.cs 配置示例

builder.Services.AddQuartz(q =>
{
    // 只需使用你在 Jobs 文件夹中创建的作业名称
    var jobKey = new JobKey("SendEmailJob");
    q.AddJob<SendEmailJob>(opts => opts.WithIdentity(jobKey));
    q.AddTrigger(opts =>
        opts
            .ForJob(jobKey)
            .WithIdentity("SendEmailJob-trigger")
            // 此 Cron 间隔可以描述为“每分钟运行一次”(当秒为零时)
            .WithCronSchedule("0 * * ? * *")
    );
});

builder.Services.AddQuartzHostedService(q => q.WaitForJobsToComplete = true);

有关 Cron 触发器及其格式的更多信息,你可以直接使用来自 Quartz 的教程 - Cron 触发器

在本文档中