构建 .NET 9 Quartz 可视化调度系统(使用 Chet.QuartzNet.UI)

在企业项目中,定时任务非常常见,比如 报表生成、数据同步、订单超时处理 等。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();

说明

  1. AddQuartzUI(builder.Configuration)

    • 自动读取 appsettings.jsonQuartzUI 节点

    • 提供 JWT 登录验证

    • 不需要手动指定 SchedulerProvider

  2. UseQuartz()

    • 启动 Quartz 调度

    • 与 UI 自动绑定

  3. 可选 AddQuartzClassJobs()

    • 自动扫描程序集里的所有 Job 并注册

五、访问 Dashboard

启动项目后,浏览器访问:

复制代码
https://localhost:5001/quartz-ui

登录界面使用:

  • 用户名:Admin

  • 密码:123456

Dashboard 功能:

  • Scheduler 状态:Running / Standby / Shutdown

  • Job 列表和 Trigger 配置

  • 暂停 / 恢复任务

  • 立即执行任务

  • 查看任务执行日志(可选)


六、生产实践建议

  1. 任务持久化

使用数据库存储 Job 和 Trigger:

复制代码
q.UsePersistentStore(x =>
{
    x.UseSqlServer(builder.Configuration.GetConnectionString("QuartzDb"));
    x.UseJsonSerializer();
});

支持 SQL Server、MySQL、PostgreSQL 等数据库。

  1. 集群部署

多实例共享数据库,保证任务不重复执行:

复制代码
API1   API2   API3
  \     |     /
   Quartz DB
  1. 动态任务管理

通过 Dashboard 或自定义 API 可以动态添加、修改任务,无需重启应用。


七、总结

通过 Quartz 3.16.1 + Quartz.Extensions.Hosting + Chet.QuartzNet.UI 2.1.1 ,你可以在 .NET 9 项目中实现:

  • 企业级定时任务调度

  • Cron 定时触发

  • 多 Job 管理

  • 可视化 UI 管理(暂停 / 恢复 / 立即执行)

  • JWT 安全登录

可以替代 Quartzmin,实现现代化、可管理、可扩展的企业级 Quartz 调度系统。

相关推荐
其实防守也摸鱼6 天前
GDB安装与配置(保姆级教程)【Linux、Windows系统】
linux·运维·windows·命令模式·工具·虚拟机·调试
其实防守也摸鱼11 天前
无线网络安全---WLAN相关安全工具--kali(理论附题目)
linux·安全·web安全·学习笔记·kali·命令模式·wlan
sg_knight13 天前
设计模式实战:命令模式(Command)
python·设计模式·命令模式
yaaakaaang13 天前
十四、命令模式
java·命令模式
无籽西瓜a13 天前
【西瓜带你学设计模式 | 第十八期 - 命令模式】命令模式 —— 请求封装与撤销实现、优缺点与适用场景
java·后端·设计模式·软件工程·命令模式
23.22 天前
【Linux】grep -F 及 双横线--的妙用
linux·命令模式
摸鱼仙人~24 天前
快照模式 vs 命令模式:一篇分清什么时候用谁
命令模式
2301_7644413324 天前
Dify工作流中实现查询优化(QO):将查询复杂度分类法与QOL框架融入工作流
人工智能·语言模型·自然语言处理·命令模式
fe7tQnVan24 天前
三大 Agent-UI 协议深度剖析:AG-UI、A2UI 与 MCP-UI 的设计哲学与工程实践
ui·状态模式·命令模式
程序员小寒1 个月前
JavaScript设计模式(八):命令模式实现与应用
前端·javascript·设计模式·ecmascript·命令模式