阅读本文你的收获
- 了解任务调度框架QuartZ.NET的核心构成
- 学会在ASP.NET Core 中使用QuartZ.NET
在项目的开发过程中,难免会遇见需要后台处理的任务,例如定时发送邮件通知、后台处理耗时的数据处理等,上次分享了ASP.NET Core中实现定时任务的第一种方式 托管服务+Timer,这种方式适用于比较简单的定时任务场景,对于更复杂的场景,我们可以使用HangFire和QuartZ.NET等成熟的任务调度框架。
这次我们对QuartZ.NET任务调度框架做一个入门。
一、什么是QuartZ.NET?
Quartz.Net 是一个.NET程序集,是非常流行的 Java 作业调度系统 Quartz 的 C#实现。
Quartz.Net 是一款功能齐全的任务调度系统,从小型应用到大型企业级系统都能适用。
功能齐全体现在触发器的多样性上面,即支持简单的定时器,也支持 Cron 表达式;即能执行重复的作业任务,也支持指定例外的日历;任务也可以是多样性的,只要继承 IJob 接口即可。
对于小型应用,Quartz.Net 可以集成到你的系统中,对于企业级系统,它提供了 Routing 支持,提供了 Group 来组织和管理任务,此外还有持久化、插件功能、负载均衡和故障迁移等满足不同应用场景的需要。
二、QuartZ.NET中的核心对象
- Scheduler - 调度器。与调度程序交互的主要API。
- IJob - 作业。你想要调度器执行的任务组件需要实现该接口 。
- JobDetail -用于定义作业详细信息。
- Trigger - 触发器。定义执行给定作业的计划的组件。
- JobBuilder - 用于定义/构建JobDetail 实例,用于定义作业的实例。
- TriggerBuilder - 用于定义/构建触发器实例。
Scheduler 的生命期,从 SchedulerFactory 创建它时开始,到 Scheduler 调用shutdown() 方法时结束;
Scheduler 被创建后,可以增加、删除和列举 Job 和 Trigger,以及执行其它与调度相关的操作(如暂停 Trigger)。
但是,Scheduler 只有在调用 start() 方法后,才会真正地触发 trigger(即执行 job)
三、入门案例
开发环境
平台版本是:.NET6
开发框架:ASP.NET Core WebApi
开发工具:Visual Studio 2022
-
安装QuartZ.NET的Nuget包
-
编写一个定时作业,必须实现IJob接口
csharpusing Quartz; //引用QuartZ命名空间 //新建一个IJob的实现类 public class FirstJob : IJob { /// <summary> /// 执行具体任务 /// </summary> /// <param name="context">作业执行上下文</param> /// <returns></returns> public Task Execute(IJobExecutionContext context) { return Task.Factory.StartNew(() => { System.Console.WriteLine("我的第一个定时任务"); //实际项目中 一般执行一些定时任务,如:统计数据、定时发送信息、定时同步数据等 }); } }
-
启动定时任务,以下例子为 在WebApi控制器中启动定时任务
csharp[Route("api/[controller]")] [ApiController] public class ValuesController : ControllerBase { [HttpGet("TestQuartZ")] public async Task<IActionResult> TestQuartZ() { //1. 创建一个调度器 var scheduler = await new StdSchedulerFactory().GetScheduler(); await scheduler.Start(); //启动 //2. 创建一个作业, var job = JobBuilder.Create<FirstJob>().Build(); //3. 创建一个简单触发器 //var trigger = TriggerBuilder.Create() // .WithSimpleSchedule(x =>{ // x.WithRepeatCount(3) //循环次数 // .WithIntervalInSeconds(1);//间隔时间 //}).Build(); //3. 创建Cron触发器(Cron触发器比简单触发器更加强大) var trigger = TriggerBuilder.Create() .WithCronSchedule("* * * * * ? *") .Build(); //将三个对象,连接在一起 await scheduler.ScheduleJob(job, trigger); return Ok(); } }
以上例子中演示了两种触发器的使用方式。
对于Simple触发器,设置规则比较简单,可以设置循环执行次数,间隔时间等。仅满足基本使用,对于想要实现更复杂的时间规则设置,如某年某月某日定时定点执行则需要用到Cron触发器,可以指定Cron表达式。在线生成CRON表达式
- 可以在Swagger中,调用/api/values/TestQuartZ接口来 启动以上定时任务。一旦定时任务启动,可以看到FirstJob类中的Execute方法每秒都会被执行一次。
结语
本文对于QuartZ.NET做了一个入门级的案例。更多高级用法将在后续分享。如果本文对你有帮助的话,请点赞+评论+关注,或者转发给需要的朋友。