.NET Core能够建立“定时”后台服务在 ASP.NET Core 中使用托管服务实现后台任务(例如,每10分钟运行一次任务),可是自带的后台服务应用场景太局限。在实际场景中,咱们一般须要指定更复杂的时间参数。例如 凌晨2点30,天天的上午10点,每两小时一次,当处理这些复杂的时间时,自带的解决方案就显得格格不入了。html
为些Quartz.NET提供了强大的解决方案, 经过使用Cron表达式,您能够确保任务在特定时间运行,或仅在特定的几天运行,或这些时间的任意组合。java
Quart.Net介绍
概述
Quartz主要有三部分组成任务(Job)、触发器(Trigger)和调度器(Schedule)。程序员
任务
Job就是执行的做业,Job须要继承IJob接口,实现Execute方法。Job中执行的参数从Execute方法的参数中获取。数据库
触发器
触发器经常使用的有两种:SimpleTrigger触发器和CronTrigger触发器。json
调度器
调度器就是将任务和触发器绑定,让触发器触发的时候去执行任务。上一个简单的案例app
案例
一、首先Nuget包引用
nuget install Quartz.AspNetCore
二、定义一个Job任务
/// <summary> /// 建立IJob的实现类,并实现Excute方法 /// </summary> public class TestJob : IJob { public Task Execute(IJobExecutionContext context) { return Task.Run(() => { Console.WriteLine("output testjob log"); }); } }
三、Api控制器调用方法建立任务
[Route("quart")] [ApiController] public class QuartController : Controller { private readonly ISchedulerFactory _schedulerFactory; public QuartController(ISchedulerFactory schedulerFactory) { _schedulerFactory = schedulerFactory; } [HttpGet("CreateTask")] public async Task<IActionResult> CreateTask() { //经过调度工厂得到调度器 var _scheduler = await _schedulerFactory.GetScheduler(); //开启调度器 await _scheduler.Start(); //建立一个触发器 var trigger = TriggerBuilder.Create() .WithSimpleSchedule(x => x.WithIntervalInSeconds(2).RepeatForever())//每两秒执行一次 .Build(); //建立任务 var jobDetail = JobBuilder.Create<TestJob>() .WithIdentity("job", "group") .Build(); //将触发器和任务器绑定到调度器中 await _scheduler.ScheduleJob(jobDetail, trigger); return new JsonResult(new { success = true }); } }
调用 localhost://quart/createtask 便可以看控制台看到每隔俩秒钟输出一段控制台信息。async
实例使用场景
上述的案例是一种经过本身建立三元素的方式来建立任务,在一些通用场景下其实咱们只关心定时任务的逻辑和执行的频率,其余我能够不考虑。工具
即领导给了我一个任务,任务的功能是:开发一个定时任务,天天02:30执行,清理数据库历史记录。那么开发者最方便的方式是什么?visual-studio
伪代码
一、定义执行Job测试
class CleanJob{ [cron表达式] public void cleanDatabase(){ 业务逻辑 } }
二、注入任务
services.Register(typeof(CleanJob))
如何可以经过这样的方式实现是最好的,可是现实是NetCore的quart.net如今还不支持这样的定义方式,java好像是能够的。
那有没有其余相似的方式能够实现上面的效果呢?
我给你们推荐一种方式
案例说明
一、定义一个初始化配置的服务注册
public static class QuartzIocExtend { public static void AddJobAndTrigger<T>(this IServiceCollectionQuartzConfigurator quartz, IConfiguration config, string category = "Default") w { string quartKey = "Quartz"; // 泛型Job的name string jobName = typeof(T).Name; // 从appsetting.json中获取任务job的corn执行表达式 var configKey = $"{quartKey}:{category}:{jobName}"; var cronSchedule = config[configKey]; // 校验cron表达式存在 if (string.IsNullOrEmpty(cronSchedule)) { throw new Exception($"No Quartz.NET Cron schedule found for job in configuration at {configKey}"); } // 注册job var jobKey = new JobKey(jobName); quartz.AddJob<T>(opts => opts.WithIdentity(jobKey)); //为job添加调度器 quartz.AddTrigger(opts => opts .ForJob(jobKey) .WithIdentity(jobName + "-cron-trigger") .WithCronSchedule(cronSchedule)); }
二、ConfigureServices中注册
//quartz 定时服务 services.AddQuartz(q => { q.UseMicrosoftDependencyInjectionScopedJobFactory(); q.AddJobAndTrigger<TestJob>(configuration); });
三、配置文件定义cron表达式
"Quartz": { "Default": { //5秒钟执行一次 "TestJob":"0/5 * * * * ? *" } }
四、执行测试
测试结果正确,每五秒钟输出文本
参考
在ASP.NET Core中建立基于Quartz.NET托管服务轻松实现做业调度
最后
本文到此结束,但愿对你有帮助 😃
若是还有什么疑问或者建议,能够多多交流,原创文章,文笔有限,才疏学浅,文中如有不正之处,万望告知。
更多精彩技术文章汇总在个人 公众号【程序员工具集】,持续更新,欢迎关注订阅收藏。