
任务调度后端【免费下载链接】quartznetQuartz Enterprise Scheduler .NET项目地址https://gitcode.com/gh_mirrors/qu/quartznet点击查看免费下载导读本课是 Quartz.NET 4.x 官方教程的第一课讲解如何在一个 .NET 托管应用Generic Host / WebApplication中从零搭建一个能够运行 Job 的调度器安装包、编写IJob、通过AddQuartz与AddQuartzHostedService接线、用声明式与运行时两种方式注册 Job 和 Trigger并理解调度器的生命周期。学完本课你将拥有一个可运行、可优雅停机的最小 Quartz 应用为后续课程深入 Job、Trigger 与调度原理打下基础。本课对应的完整源码位于 UsingQuartzSamples.cs文档中所有代码片段均与仓库中的 region 标记一一对应可对照阅读。安装包在 .NET 项目中执行dotnet add package Quartz对于托管应用这就是全部安装步骤——依赖注入与托管服务hosted service都已包含在核心包内在 3.x 中它们还是独立的Quartz.Extensions.DependencyInjection与Quartz.Extensions.Hosting两个包对应仓库中的 Quartz.Extensions.DependencyInjection 与 Quartz.Extensions.Hosting 目录4.x 起合并进Quartz主包。编写一个 JobJob 就是实现IJob接口的类public sealed class HelloJob : IJob { private readonly ILoggerHelloJob logger; public HelloJob(ILoggerHelloJob logger) { this.logger logger; } public ValueTask Execute(IJobExecutionContext context, CancellationToken cancellationToken default) { logger.LogInformation(Hello from {JobKey}, context.JobDetail.Key); return default; } }关于这个实现有两个关键点值得说明容器为每次触发fire构造 Job 实例。也就是说Job 的构造函数可以直接声明任何已注册的服务ILoggerT、DbContext、类型化HttpClient等。从源码看IJob.cs 的注释明确指出每个 Job 实例由调度器的IJobFactory构造默认的工厂从依赖注入容器解析 Job——因此不存在“必须有无参构造函数”的要求。cancellationToken就是context.CancellationToken。文档强调应当把这个 token 传递给你 await 的一切调用这样一次停机shutdown或一次Interrupt调用才能到达你的业务代码。在 IJob.cs 的实现注释中对此有更详细的解释该 token 在IScheduler.Interrupt(JobKey, …)被调用或调度器配置为中断运行中 Job 而停机时被触发忽略它的长任务将无法被中断并会阻塞停机直到自行结束。配置宿主Host通过HostApplicationBuilder把调度器接入应用生命周期HostApplicationBuilder builder Host.CreateApplicationBuilder(args); builder.AddQuartz(q { // run HelloJob now, and then every 40 seconds q.ScheduleJobHelloJob(trigger trigger .WithIdentity(helloTrigger) .StartNow() .WithSimpleSchedule(x x .WithInterval(TimeSpan.FromSeconds(40)) .RepeatForever())); }); builder.AddQuartzHostedService(options options.WaitForJobsToComplete true); IHost host builder.Build(); // blocks until the host is stopped, and then until the last running job completes await host.RunAsync();两个扩展方法的分工如下表调用作用AddQuartz注册调度器及组成它的所有部件AddQuartzHostedService随宿主启动调度器宿主停止时关闭调度器WaitForJobsToComplete让停机等待正在运行的 Job 完成而不是取消它们几个值得注意的细节两种构造方式都支持。这两个方法都是IHostApplicationBuilder的扩展方法因此同样适用于WebApplication.CreateBuilder(args)如果你手里只有IServiceCollection则使用其重载builder.Services.AddQuartz(…)。源码 QuartzHostApplicationBuilderExtensions.cs 显示IHostApplicationBuilder.AddQuartz本质上把构造器自带的配置节Quartz交给IServiceCollection.AddQuartz处理——所以builder.AddQuartz(…)会自动读取应用配置中名为Quartz的配置节而纯 ServiceCollection 重载需要手动传入配置节。AddQuartz与AddQuartzHostedService的调用顺序无关紧要。从 QuartzHostedService.cs 的实现注释看调度器是在宿主启动时才从容器解析的而不是在注册时解析因此两者可以任意先后调用。QuartzHostedServiceOptions不止一个选项。QuartzHostedServiceOptions.cs 还定义了另外三个开关StartDelay延迟启动配合AwaitApplicationStarted时从应用启动完成开始计时、AwaitApplicationStarted默认true应用启动完成前不触发任何 Job避免 Job 在应用初始化期间运行、AutoStart默认true设为false时调度器被创建、初始化并绑定但保持Created状态留给应用自行调用IScheduler.Start常用于自管 leader 选举等场景。多个调度器各有一份选项。选项是命名选项named options每个调度器名字对应一份因此同一个宿主中可以做到“一个调度器等待应用启动完成另一个立即启动”。描述 Job 与 Triggerq.ScheduleJobTJob(…)将一个 Job 配一个 Trigger注册在一起且 Job 的身份取自 Trigger 的身份。当一个 Job 有多个 Trigger或者 Job 需要在排程之外单独注册时应分开注册builder.AddQuartz(q { JobKey jobKey new(reportJob); q.AddJobReportJob(j j .WithIdentity(jobKey) .WithDescription(nightly and on-demand sales report)); q.AddTriggerReportJob(t t .ForJob(jobKey) .WithIdentity(nightly) .WithCronSchedule(0 0 2 * * ?)); q.AddTriggerReportJob(t t .ForJob(jobKey) .WithIdentity(hourly-on-weekdays) .WithCronSchedule(0 0 9-17 ? * MON-FRI)); });要点说明AddTriggerTJob的类型参数表示该 Trigger 所触发的 Job。它让 Trigger 的数据可以以那个 Job 的属性形式命名详见 More About Jobs JobDetails。如果 Trigger 只按 Key 命名 Job则使用不带类型参数的裸AddTrigger。Cron 表达式的字段顺序。0 0 2 * * ?依次表示 秒、分、时、日、月、星期含义是每天 02:00 执行。完整的字段语义参考 Cron Expression Reference。Cron 只是五种调度方式之一其余四种Simple、Calendar Interval、Daily Time Interval、Recurrence见 Lesson 2Jobs and Triggers。每次调度器启动时也运行一次追加q.RunAtStartup(jobKey)即可参见 Multiple Triggers。持久化语义以这种方式注册的一切都会在调度器启动时被存储。当使用持久化 Job 存储时注册默认会替换同名存储定义——也就是说这段注册清单描述的是“每次启动时的排程”而不是“只播种一次”。因此建议把属于应用组成部分的固定排程用这种声明式方式注册调度器会在每次启动时让存储与之一致。运行时调度对于属于应用固定组成部分的排程优先使用上面的声明式注册而启动时未知的排程可以注入IScheduler随时创建并注册public sealed class ReportRequests { private readonly IScheduler scheduler; public ReportRequests(IScheduler scheduler) { this.scheduler scheduler; } public async ValueTask QueueFor(string customer, CancellationToken cancellationToken) { IJobDetail job JobBuilder.CreateReportJob() .WithIdentity(customer, reports) .UsingJobData(customer, customer) .Build(); ITrigger trigger TriggerBuilder.Create() .WithIdentity(customer, reports) .StartAt(DateTimeOffset.UtcNow.AddMinutes(5)) .Build(); await scheduler.ScheduleJob(job, trigger, cancellationToken: cancellationToken); } }这里的模式是标准的 Quartz 三步曲JobBuilder描述“做什么”TriggerBuilder描述“何时做”IScheduler.ScheduleJob把两者绑到一起。上例中Job 的身份(customer, reports)与 Trigger 的身份一致并且通过UsingJobData(customer, customer)把客户标识写进 JobDataMap供ReportJob执行时读取。当系统中存在多个调度器时每个调度器都注册在一个名字下注入时使用[FromKeyedServices(reporting)] IScheduler scheduler按名字取用详见 Multiple schedulers。从 QuartzHostedService.cs 的CreateSchedulers可以看出容器中的默认调度器通过ISchedulerFactory.GetScheduler()解析每个命名调度器则通过以名字为 key 的ISchedulerFactory解析——这就是运行时注入IScheduler的底层支撑。调度器的生命周期最后理解调度器在整个应用运行过程中的状态机Trigger 在调度器启动前不会触发。托管服务AddQuartzHostedService注册的QuartzHostedService实现自IHostedLifecycleService见 QuartzHostedService.cs负责启动它。Standby()暂停触发而不关闭任何东西Start()恢复触发。运行中的 Job 继续运行不受影响。Shutdown()是终局操作。已关闭的调度器无法再次启动只能新建一个。调度器实现IAsyncDisposable。Dispose 它会关闭调度器并释放其占有的资源在宿主环境下这个工作由宿主完成——从 QuartzHostedService.cs 的ShutdownSchedulers可以看到停机时宿主会把每个调度器以WaitForJobsToComplete的语义并发关闭并汇总所有关闭异常后抛出AggregateException。综合来看生命周期模型可以归纳为Start→任意次Standby/Start切换→Shutdown/Dispose任何一次Shutdown都不可逆。下一步本课建立了一个完整的最小可运行调度应用。接下来进入 Lesson 2Jobs and Triggers系统了解 Job 与 Trigger 的类型、属性和调度语义也可以继续阅读 More About Jobs JobDetails 深入了解 JobDetail 与身份机制。本课中出现的全部示例代码均可在仓库的 UsingQuartzSamples.cs 中直接找到并运行。赞分享任务调度后端【免费下载链接】quartznetQuartz Enterprise Scheduler .NET项目地址https://gitcode.com/gh_mirrors/qu/quartznet点击查看免费下载相关推荐Quartz调度框架入门教程第一课 基础使用指南Quartz调度框架入门教程第一课 基础使用指南 前言 Quartz是一个功能强大且广泛使用的开源作业调度框架它允许开发者按照预定的时间计划执行各种任务。本任务调度后端Quartz.NET 4 快速入门安装、配置与第一个调度程序实战Quartz.NET 4 快速入门安装、配置与第一个调度程序实战 本篇指南以 Quartz.NET 4.x 官方 Quick Start 文档为骨架完整覆盖任务调度后端如何快速配置AtlasOS系统面向技术爱好者的完整性能优化指南如何快速配置AtlasOS系统面向技术爱好者的完整性能优化指南 AtlasOS是一个开源透明的Windows系统优化方案专注于性能提升、隐私保护和用户体验优操作系统隐私合规上一篇PiKVM Persistent StoragePST完全指南利用 256MiB 分区安全持久化数据与定时任务下一篇Dism 完整使用指南Windows 系统优化 3 步搞定C 盘救急的免费开源方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考