GZY.Quartz.MUI基于Quartz的UI可视化操作组件发布新增仪表盘和检索功能在现代企业级应用中任务调度是保障系统稳定运行的关键组件。Quartz.NET 作为 .NET 生态中最成熟的任务调度框架提供了强大的定时任务管理能力但其原生 API 需要开发者编写大量代码进行任务配置、监控和管理。为了降低使用门槛GZY.Quartz.MUI 应运而生——一个基于 Quartz.NET 的 UI 可视化操作组件通过 Web 界面实现任务的创建、编辑、监控和检索。本文将深入剖析其核心原理并演示如何通过代码集成仪表盘和检索功能。## 组件架构与设计原理GZY.Quartz.MUI 的核心设计理念是“零代码配置全 Web 管理”。它基于 Quartz.NET 的IScheduler接口在内存或数据库中维护任务元数据并通过 ASP.NET Core 中间件暴露 RESTful API 和前端 UI。其架构包含三层-数据层使用 Entity Framework Core 存储任务信息JobDetail、Trigger、Calendar 等支持 SQL Server、MySQL、PostgreSQL 等数据库。-调度层通过QuartzHostedService托管调度器生命周期自动从数据库恢复任务。-UI 层基于 MUIMaterial-UI构建响应式前端通过 SignalR 实现实时状态更新。新增的仪表盘功能通过聚合调度器中的任务运行数据如成功/失败次数、执行耗时、触发频率生成可视化图表而检索功能则依赖数据库索引和 Elasticsearch 实现毫秒级任务查找。## 集成仪表盘功能实时监控任务状态仪表盘的核心是统计JobExecutionHistory表中的数据。我们可以通过自定义IJobListener记录每次执行的开始时间、结束时间、结果和异常信息。以下代码展示如何实现一个简单的执行记录器csharpusing Quartz;using Quartz.Impl.Matchers;using System;using System.Threading.Tasks;public class ExecutionHistoryListener : IJobListener{ private readonly IScheduler _scheduler; public ExecutionHistoryListener(IScheduler scheduler) { _scheduler scheduler; } public string Name ExecutionHistoryListener; public async Task JobToBeExecuted(IJobExecutionContext context, CancellationToken cancellationToken default) { // 在任务执行前记录开始时间 context.MergedJobDataMap.Put(ExecutionStartTime, DateTime.UtcNow); await Task.CompletedTask; } public async Task JobWasExecuted(IJobExecutionContext context, JobExecutionException? jobException, CancellationToken cancellationToken default) { var startTime (DateTime)context.MergedJobDataMap.Get(ExecutionStartTime); var endTime DateTime.UtcNow; var duration endTime - startTime; var success jobException null; var exceptionMessage jobException?.Message ?? string.Empty; // 将执行记录写入数据库使用你选择的 ORM // 例如_dbContext.ExecutionHistories.Add(new ExecutionHistory { ... }); Console.WriteLine($任务 {context.JobDetail.Key} 执行完毕耗时 {duration.TotalMilliseconds}ms状态{(success ? 成功 : 失败)}); } public Task ExecutionVetoed(IJobExecutionContext context, CancellationToken cancellationToken default) { return Task.CompletedTask; }}// 在 Startup.cs 中注册监听器public void Configure(IApplicationBuilder app, IWebHostEnvironment env){ var scheduler app.ApplicationServices.GetRequiredServiceIScheduler(); scheduler.ListenerManager.AddJobListener(new ExecutionHistoryListener(scheduler), GroupMatcherJobKey.AnyGroup());}仪表盘前端通过 SignalR 订阅OnJobExecuted事件实时更新图表。例如使用 Chart.js 绘制最近 24 小时内每小时的任务执行成功率。该功能帮助运维人员快速定位高失败率的任务。## 实现检索功能高效搜索任务和日志任务数量膨胀后手动查找特定任务变得困难。GZY.Quartz.MUI 的检索功能支持按任务名称、组名、触发器规则、执行状态等字段进行全文搜索。以下代码展示如何通过IJobStore接口实现基于名称的模糊搜索csharpusing Quartz;using Quartz.Spi;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;public class CustomJobStoreWithSearch : IJobStore{ private readonly IJobStore _innerStore; // 假设注入 Quartz 的 AdoJobStore 或 RAMJobStore private readonly IScheduler _scheduler; public CustomJobStoreWithSearch(IJobStore innerStore, IScheduler scheduler) { _innerStore innerStore; _scheduler scheduler; } // 实现搜索方法返回匹配的任务键列表 public async TaskIReadOnlyListJobKey SearchJobsAsync(string query, CancellationToken cancellationToken) { var allJobKeys await _innerStore.GetJobKeys(GroupMatcherJobKey.AnyGroup(), cancellationToken); return allJobKeys .Where(key key.Name.Contains(query, StringComparison.OrdinalIgnoreCase) || key.Group.Contains(query, StringComparison.OrdinalIgnoreCase)) .ToList(); } // 其他 IJobStore 方法委托给 _innerStore public async Task StoreJob(JobDetail newJob, bool replaceExisting, CancellationToken cancellationToken) await _innerStore.StoreJob(newJob, replaceExisting, cancellationToken); // ... 其余约 30 个方法类似委托}// 在 Program.cs 中注册自定义 JobStorebuilder.Services.AddQuartz(q { q.UsePersistentStore(store { store.UseSqlServer(YourConnectionString); store.UseJsonSerializer(); // 包装自定义存储 store.UseJobStoreCustomJobStoreWithSearch(); });});检索功能的前端实现了一个防抖搜索框输入关键字后 300 毫秒内自动请求/api/jobs/search?q{query}接口返回匹配的任务列表。结合 Elasticsearch还能支持更复杂的查询如按执行次数排序、按最后执行时间范围过滤。## 总结GZY.Quartz.MUI 通过可视化的仪表盘和强大的检索功能显著降低了 Quartz.NET 的任务管理复杂度。仪表盘利用IJobListener和 SignalR 实现实时监控检索功能则通过自定义IJobStore或集成 Elasticsearch 提供高效搜索。开发人员只需少量代码即可集成这些能力将精力集中在业务逻辑本身。未来该组件还计划支持任务依赖图、动态调整线程池大小等功能进一步迈向企业级调度平台。
企业数字化 ERP 产品动态
相关推荐
TI Jacinto 7显示子系统:多屏、高安全嵌入式视觉中枢架构与实战 1. 项目概述:为什么我们需要一个强大的显示子系统?在今天的汽车座舱、高端工业人机界面(HMI)或者任何需要丰富视觉交互的嵌入式设备里,你看到的往往不再是一块简单的屏幕。仪表盘、中控娱乐屏、副驾娱乐屏、电子后视镜… · 2026/9/21 0:40:58
LLMs如何重塑科研生态:效率提升背后的创新隐忧 最近和几位在高校做科研的朋友聊天,发现一个挺有意思的现象:他们实验室里,从博士生到年轻讲师,几乎人手一个AI助手。写论文时用它查文献、润色英文,做数据分析时让它写脚本、调参数,甚至项目申报书、结题报… · 2026/9/17 20:26:24
AI内容检测与降AI率技术全解析 1. 项目背景与核心痛点在内容创作领域,AI生成内容的泛滥已经成为一个不可忽视的问题。从学术论文到商业文案,从社交媒体到专业报告,AI生成内容正在以惊人的速度渗透到各个行业。这种现象带来的直接后果是内容同质化严重、缺乏真实性和创造性&… · 2026/7/30 16:10:17
Win7系统下载避坑指南:面试必问的环境配置实战与底层逻辑 Win7系统下载避坑指南:面试必问的环境配置实战与底层逻辑 配置环境就卡半天,这大概是很多开发者最崩溃的瞬间。明明照着教程一步步来,结果系统蓝屏、驱动缺失、激活失败,时间全耗在了无关紧要的等待上。更扎心的是,面试官随口一问“你本地开发环境怎… · 2026/9/22 23:06:13
例如避坑指南 3大Python版本升级深坑:源码解析带你避开API变动陷阱 刚把项目从 Python 2.7 升到 3.11,或者从 3.8 跳到 3.12,代码一跑就崩?别慌,这太正常了。很多转岗做后端或自动化的朋友,接手旧项目时最常遇到的噩梦就是… · 2026/9/22 23:06:07
一文搞懂build命令底层逻辑,面试不再挂 一文搞懂build命令底层逻辑,面试不再挂 面试被问“build命令到底做了什么”,如果你只能答出“打包文件”,面试官的眼神通常会瞬间冷下来。很多开发者以为 build… · 2026/9/22 23:06:00
彭贤踩坑实录:手写实现缓存穿透拦截,QPS从5k飙到50k 彭贤踩坑实录:手写实现缓存穿透拦截,QPS从5k飙到50k 上周二凌晨三点,监控告警炸了。订单服务CPU飙到98%,DB连接池耗尽,直接宕机。排查发现,前端有个恶意脚本在疯狂请求不存在的商品ID,导致缓存全部穿透,请求全打在MySQL上。… · 2026/9/22 23:05:54
极简设计避坑指南:5个核心原则搞定复杂系统 极简设计避坑指南:5个核心原则搞定复杂系统 别被官方文档那几百页的篇幅吓退,其实核心逻辑就那几条。很多新手卡在“官方文档太长抓不住重点”,导致项目越写越烂。这份避坑指南直接拆解底层原理,帮你用最短时间看懂极简设计的本质。… · 2026/9/22 23:05:40
Word怎么显示目录:3步解决卡顿与报错的性能优化实战 Word怎么显示目录:3步解决卡顿与报错的性能优化实战 打开Word文档,想插入个自动目录,结果光标一闪一闪,软件直接卡死或者报错。配置环境就卡半天,这种体验谁懂?很多老手觉得这是小问题,但当你处理几百页的标书、论文或技术文档时,目录生成的… · 2026/9/22 23:04:58
5个电影海报图片处理坑,新手避坑指南 5个电影海报图片处理坑,新手避坑指南 刚写完代码,一运行屏幕直接炸了。满屏红色的 StackTrace 滚得比弹幕还快,什么 NullPointerException 、 ImageIO.read() returned null 、… · 2026/9/22 0:00:07
注册微信公众账号:一文搞懂从0到1全流程 注册微信公众账号:一文搞懂从0到1全流程 复制来的代码跑不通,报错信息满屏飞,到底卡在哪?别急,咱们先停下手里的调试。很多开发者觉得注册微信公众账号只是填个表单、传个身份证那么简单,真上手才发现坑深不见底。今天这篇 一文搞懂… · 2026/9/22 0:00:07