GZY.Quartz.MUI(基于Quartz的UI可视化操作组件) ..发布 新增仪表盘和检索功能 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 提供高效搜索。开发人员只需少量代码即可集成这些能力将精力集中在业务逻辑本身。未来该组件还计划支持任务依赖图、动态调整线程池大小等功能进一步迈向企业级调度平台。

相关新闻

最新新闻

KeyStone II时钟与电源设计:从原理到实战的硬件可靠性保障

KeyStone II时钟与电源设计:从原理到实战的硬件可靠性保障

1. 项目概述:为什么时钟与电源是KeyStone II设计的“命门”?在嵌入式系统,尤其是像德州仪器(TI)KeyStone II这类高性能多核DSP/SoC的设计中,时钟和电源往往是最容易被新手工程师轻视,却又在项目…

2026/7/27 5:48:56
嵌入式语音识别系统性能优化:从DSP资源消耗分析到现代AI部署

嵌入式语音识别系统性能优化:从DSP资源消耗分析到现代AI部署

1. 项目概述与核心价值在嵌入式语音识别系统开发的早期,尤其是在上世纪90年代,工程师们面临的核心挑战是如何在有限的硬件资源(如CPU主频、内存容量)下,实现一个满足实时性要求的系统。当时,像TMS320C3x/C4…

2026/7/27 5:48:56
MySQL从入门到精通:构建高性能数据库服务的完整知识体系与实践指南

MySQL从入门到精通:构建高性能数据库服务的完整知识体系与实践指南

如果你刚开始接触数据库,可能会觉得 MySQL 就是个“存数据的软件”,安装、建表、写两句 SQL 就算会了。但真正在项目中,你会发现事情远不止如此:为什么别人的查询比你快几十倍?为什么你的数据库动不动就锁死&#xff1…

2026/7/27 5:48:56
LangChain4j负载均衡与故障转移实战指南

LangChain4j负载均衡与故障转移实战指南

1. 项目概述:LangChain4j中的负载均衡与故障转移挑战在构建基于LangChain4j的AI应用时,模型服务的稳定性直接决定了系统可靠性。我去年参与的一个金融知识问答系统就曾因单点故障导致服务中断6小时——这正是今天要讨论的负载均衡与故障转移技术的现实意…

2026/7/27 5:48:56
无人机路径规划中的CPO算法与Matlab实现

无人机路径规划中的CPO算法与Matlab实现

1. 项目背景与核心价值穿山甲算法(CPO)在无人机路径规划领域的应用研究,本质上是在解决复杂环境下无人机自主导航的优化问题。2025年这个时间节点暗示了该研究的前瞻性——随着低空空域逐步开放和无人机应用场景爆发式增长,传统路径规划算法在动态避障、…

2026/7/27 5:48:56
Windows下Ubuntu环境搭建

Windows下Ubuntu环境搭建

VM下载 阿里云盘分享 提取码:47pp 含 VM16 和 VM17 VMware Workstation Pro 16 激活码分享: ZF3R0-FHED2-M80TY-8QYGC-NPKYF YF390-0HF8P-M81RQ-2DXQE-M2UT6 ZF71R-DMX85-08DQY-8YMNC-PPHV8 VMware Workstation Pro 17 激活码分享&…

2026/7/27 5:43:56

月新闻