尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Quartz.NET 4.x 教程第一课:使用 Quartz 搭建首个调度应用
任务调度后端【免费下载链接】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),仅供参考
RELATED

相关推荐

codex-ppt-skill 安装与配置全指南:从 Codex、OpenClaw 到第三方生图 API 的完整落地

codex-ppt-skill 安装与配置全指南:从 Codex、OpenClaw 到第三方生图 API 的完整落地

AI 技能人工智能 【免费下载链接】codex-ppt-skill GPT-Image-2 PPT Generator Skill for Creating Image-Based PowerPoint Presentations in Codex and Other Skill-Compatible Agents 项目地址: https://gitcode.com/gh_mirrors/co/codex-ppt-skill 点击查看 免费…

📅 2026/10/9 2:32:13
基于hive的歌曲音乐筛选推荐系统网站(源码+文档+部署讲解等)

基于hive的歌曲音乐筛选推荐系统网站(源码+文档+部署讲解等)

联系博主 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 …

📅 2026/10/9 2:32:13
基于springboot的在线银行管理系统的设计与实现(源码+文档+部署讲解等)

基于springboot的在线银行管理系统的设计与实现(源码+文档+部署讲解等)

联系博主 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 …

📅 2026/10/9 2:32:13
MORE NEWS

更多资讯

📰

ChatGLM大模型微调实战:单卡LoRA从环境配置到部署避坑指南

简介:面向ChatGLM系列大模型微调需求的实践资源包,聚焦AI大模型应用与自然语言处理场景,适合正在学习或落地大模型微调的开发者、算法工程师与科研人员。压缩包内共148个文件,以58个Python脚本、36个Jupyter Notebook为核心&#…

📰

Keras-Transformer中英翻译项目实操:模型原理、环境配置与避坑指南

简介:基于Python的中英机器翻译系统采用Keras-Transformer模型,面向深度学习初学者及毕业设计、课程设计场景,提供一套结构完整、可直接运行的机器翻译项目方案。资源共20个文件,压缩包7.42MB,包含核心Python脚本、Jup…

📰

开源商城前端选型指南:关键维度与避坑实录

先聊一个我这两年越来越坚定的判断:商城系统开发这事儿,选型前端项目比绝大多数人想象中更重要,甚至可以说,它在很大程度上决定了你后续三到六个月的开发状态是“顺风顺水”还是“拆东墙补西墙”。我自己见过太多团队,…

📰

多店铺管理如何用API集成实现自动化订单同步与库存联动

做电商的人都知道,店铺一多,运营就乱。以前我盯两家店的时候,靠Excel还能勉强撑住,商品改个价格两台电脑来回切,订单导出导入反复核对。等店铺数量到了五家以上,这套手工流程基本就崩了——不是某个环节出错…

📰

Spring Bean初始化必知:@PostConstruct原理、应用场景与避坑指南

1. 为什么我建议不要在构造函数里做初始化先说一个常见的场景:Spring Boot项目启动后,需要从数据库加载一批配置数据到内存缓存中,或者需要在应用启动时初始化一个线程池、连接池、加载敏感词库之类的资源。很多初学者会把这段初始化逻辑直接…

📰

微信小程序+PHP校友惠超市管理系统源码深度解析

1. 项目概述1.1 核心需求解析“师大校友惠超市管理系统”这个名字一出来,基本就能猜到它的定位:一个跑在微信小程序里的会员制超市购物平台,核心服务对象是高校校友这个特殊群体。所谓“校友惠”,说白了就是学校背书、校友专享的优…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬