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