在企业项目中,定时任务非常常见,比如 报表生成、数据同步、订单超时处理 等。Quartz.NET 是 .NET 生态最流行的任务调度框架,而 Chet.QuartzNet.UI 提供了一个现代化可视化界面,让开发者轻松管理任务和触发器。
本文展示如何在 .NET 9 项目中使用 Quartz 3.16.1 + Quartz.Extensions.Hosting + Chet.QuartzNet.UI 2.1.x 构建可视化调度系统。
一、项目依赖
在 .csproj 中添加 NuGet 包:
<ItemGroup>
<PackageReference Include="Chet.QuartzNet.UI" Version="2.1.1" />
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.12" />
<PackageReference Include="Quartz" Version="3.16.1" />
<PackageReference Include="Quartz.AspNetCore" Version="3.16.1" />
<PackageReference Include="Quartz.Extensions.Hosting" Version="3.16.1" />
</ItemGroup>
说明:
-
Quartz 3.16.1:核心调度框架
-
Quartz.AspNetCore:将 Quartz 集成到 ASP.NET Core
-
Quartz.Extensions.Hosting:提供 HostedService 支持,应用启动时自动调度任务
-
Chet.QuartzNet.UI 2.1.1:可视化管理界面
-
Microsoft.AspNetCore.OpenApi:生成 Swagger API(可选)
二、Quartz UI 配置
在 appsettings.json 中添加 Quartz UI 配置:
{
"QuartzUI": {
"JwtSecret": "Y2V0aFF1YXJ6TmV0VUlBdXRoZW50aWNhdGlvblNlY3JldA==",
"JwtExpiresInMinutes": 60,
"JwtIssuer": "Chet.QuartzNet.UI",
"JwtAudience": "Chet.QuartzNet.UI",
"UserName": "Admin",
"Password": "123456"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}
说明:
-
JwtSecret:JWT 签名密钥 -
JwtExpiresInMinutes:Token 有效期 -
UserName / Password:Dashboard 登录账号
这样可以保证 Quartz UI 只允许认证用户访问。
三、创建 Job
Quartz 任务需要实现 IJob 接口:
using Quartz;
namespace QuartzDemo.Jobs;
public class HelloJob : IJob
{
private readonly ILogger<HelloJob> _logger;
public HelloJob(ILogger<HelloJob> logger)
{
_logger = logger;
}
public Task Execute(IJobExecutionContext context)
{
_logger.LogInformation($"HelloJob executed at {DateTime.Now}");
return Task.CompletedTask;
}
}
Execute方法中放置定时任务逻辑,比如打印日志或调用业务接口。
四、Program.cs 配置 Quartz 和 UI
.NET 9 Minimal API 示例:
using Chet.QuartzNet.UI.Extensions;
using Quartz;
using QuartzDemo.Jobs;
var builder = WebApplication.CreateBuilder(args);
// 注册 Controllers 和 OpenAPI
builder.Services.AddControllers();
builder.Services.AddOpenApi();
// 注册 Quartz HostedService
builder.Services.AddQuartzHostedService();
// 注册 Quartz UI 服务
builder.Services.AddQuartzUI(builder.Configuration);
// 可选:自动扫描并注册所有 ClassJob
// builder.Services.AddQuartzClassJobs();
var app = builder.Build();
// 配置 OpenAPI(开发环境可用)
if (app.Environment.IsDevelopment())
{
app.MapOpenApi();
}
app.UseHttpsRedirection();
app.UseAuthorization();
// 映射 Controller
app.MapControllers();
// 挂载 Quartz UI
app.UseQuartz();
// 测试首页
app.MapGet("/", () => "Quartz Running");
app.Run();
说明
-
AddQuartzUI(builder.Configuration)
-
自动读取
appsettings.json中QuartzUI节点 -
提供 JWT 登录验证
-
不需要手动指定 SchedulerProvider
-
-
UseQuartz()
-
启动 Quartz 调度
-
与 UI 自动绑定
-
-
可选 AddQuartzClassJobs()
- 自动扫描程序集里的所有 Job 并注册
五、访问 Dashboard
启动项目后,浏览器访问:
https://localhost:5001/quartz-ui
登录界面使用:
-
用户名:
Admin -
密码:
123456
Dashboard 功能:
-
Scheduler 状态:Running / Standby / Shutdown
-
Job 列表和 Trigger 配置
-
暂停 / 恢复任务
-
立即执行任务
-
查看任务执行日志(可选)
六、生产实践建议
- 任务持久化
使用数据库存储 Job 和 Trigger:
q.UsePersistentStore(x =>
{
x.UseSqlServer(builder.Configuration.GetConnectionString("QuartzDb"));
x.UseJsonSerializer();
});
支持 SQL Server、MySQL、PostgreSQL 等数据库。
- 集群部署
多实例共享数据库,保证任务不重复执行:
API1 API2 API3
\ | /
Quartz DB
- 动态任务管理
通过 Dashboard 或自定义 API 可以动态添加、修改任务,无需重启应用。
七、总结
通过 Quartz 3.16.1 + Quartz.Extensions.Hosting + Chet.QuartzNet.UI 2.1.1 ,你可以在 .NET 9 项目中实现:
-
企业级定时任务调度
-
Cron 定时触发
-
多 Job 管理
-
可视化 UI 管理(暂停 / 恢复 / 立即执行)
-
JWT 安全登录
可以替代 Quartzmin,实现现代化、可管理、可扩展的企业级 Quartz 调度系统。

