适用于 .NET 6+ / ASP.NET Core 的 Quartz.NET 完整使用指南,包含任务调度、依赖注入、持久化、动态控制等核心功能。
🔍 1. 简介
Quartz.NET 是一个开源的作业调度框架,功能强大且灵活,适用于需要定时执行任务的场景。其主要特性包括:
- 支持 Cron 表达式
- 持久化任务信息到数据库
- 分布式部署能力
- 动态添加/暂停/恢复/删除任务
- 集成 ASP.NET Core 依赖注入系统
核心组件
组件 | 描述 |
---|---|
IJob | 实现具体业务逻辑的任务类 |
Trigger | 控制任务触发规则(如时间间隔或 Cron 表达式) |
Scheduler | 调度器,负责管理并运行任务 |
JobStore | 存储任务信息(内存或数据库) |
📦 2. 安装
使用 .NET CLI
安装 Quartz.NET 及相关扩展包:
dotnet add package Quartz
dotnet add package Quartz.Extensions.Hosting
如需持久化支持(SQL Server):
dotnet add package Quartz.Plugins
dotnet add package Quartz.Serialization.Json
⚙️ 3. 基本使用
创建 Job 类
using Quartz;
public class HelloJob : IJob
{
public Task Execute(IJobExecutionContext context)
{
Console.WriteLine($"Hello! 当前时间: {DateTime.Now}");
return Task.CompletedTask;
}
}
注册 Quartz 到 DI 容器(ASP.NET Core)
在 Program.cs
中注册 Quartz 服务:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddQuartz(q =>
{
q.AddJob<HelloJob>(opts => opts.WithIdentity("HelloJob"));
q.AddTrigger(opts => opts
.ForJob("HelloJob")
.WithIdentity("HelloJob-trigger")
.WithSimpleSchedule(x => x.WithIntervalInSeconds(5).RepeatForever()));
});
builder.Services.AddQuartzHostedService(q => q.WaitForJobsToComplete = true);
var app = builder.Build();
app.Run();
⏰ 4. 使用 Cron 表达式
Cron 表达式提供更灵活的时间调度方式。
q.AddTrigger(opts => opts
.ForJob("HelloJob")
.WithIdentity("cron-trigger")
.WithCronSchedule("0/10 * * * * ?")); // 每 10 秒执行一次
📌 提示: 推荐使用 https://cron.ciding.cc 工具辅助生成表达式。
💡 5. 依赖注入支持
Quartz 支持通过构造函数注入服务,例如发送邮件的服务。
示例代码
public class EmailJob : IJob
{
private readonly IEmailService _emailService;
public EmailJob(IEmailService emailService)
{
_emailService = emailService;
}
public Task Execute(IJobExecutionContext context)
{
return _emailService.SendAsync("定时邮件", "Quartz.NET 发来的");
}
}
注册服务
builder.Services.AddTransient<IEmailService, EmailService>();
builder.Services.AddQuartz(q =>
{
q.UseMicrosoftDependencyInjectionJobFactory(); // 启用 DI 工厂
q.AddJob<EmailJob>(opts => opts.WithIdentity("EmailJob"));
});
💾 6. 任务持久化(数据库存储)
安装包
dotnet add package Quartz.Plugins
dotnet add package Quartz.Serialization.Json
配置 SQL Server 数据库
builder.Services.AddQuartz(q =>
{
q.UsePersistentStore(options =>
{
options.UseProperties = true;
options.UseSqlServer("YourConnectionString");
options.UseJsonSerializer();
});
});
数据库建表脚本
前往官方 GitHub 获取建表脚本:
🔗 Quartz.NET Schema
🔄 7. 动态控制任务
你可以通过 IScheduler
接口实现任务的动态控制:
var scheduler = await schedulerFactory.GetScheduler();
// 暂停任务
await scheduler.PauseJob(new JobKey("HelloJob"));
// 恢复任务
await scheduler.ResumeJob(new JobKey("HelloJob"));
// 删除任务
await scheduler.DeleteJob(new JobKey("HelloJob"));
欢迎关注我的公众号“Net分享”,技术文章第一时间推送,随缘更新 , 分享一些你可能注意不到的细节