Core如何集成定时任务处理库Quart?
.NET Core可以创建“定时”后台服务在 ASP.NET Core 中使用托管服务实现后台任务(例如,每10分钟运行一次任务),但是自带的后台服务应用场景太局限。在实际场景中,我们通常需要指定更复杂的时间参数。例如 凌晨2点30,每天的上午10点,每两小时一次,当处理这些复杂的时间时,自带的解决方案就显得格格不入了。
为些Quartz.NET提供了强大的解决方案, 通过使用Cron表达式,您可以确保任务在特定时间运行,或仅在特定的几天运行,或这些时间的任意组合。
Quart.Net介绍
概述
Quartz主要有三部分组成任务(Job)、触发器(Trigger)和调度器(Schedule)。
任务
Job就是执行的作业,Job需要继承IJob接口,实现Execute方法。Job中执行的参数从Execute方法的参数中获取。
触发器
触发器常用的有两种:SimpleTrigger触发器和CronTrigger触发器。
调度器
调度器就是将任务和触发器绑定,让触发器触发的时候去执行任务。上一个简单的案例
案例
1、首先Nuget包引用
nuget install Quartz.AspNetCore
2、定义一个Job任务
/// <summary> /// 创建IJob的实现类,并实现Excute方法 /// </summary> public class TestJob : IJob { public Task Execute(IJobExecutionContext context) { return Task.Run(() => { Console.WriteLine("output testjob log"); }); } }
3、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 即可以看控制台看到每隔俩秒钟输出一段控制台信息。
实例使用场景
上述的案例是一种通过自己创建三元素的方式来创建任务,在一些通用场景下其实我们只关心定时任务的逻辑和执行的频率,其他我可以不考虑。
即领导给了我一个任务,任务的功能是:开发一个定时任务,每天02:30执行,清理数据库历史记录。那么开发者最方便的方式是什么?
伪代码
1、定义执行Job
class CleanJob{ [cron表达式] public void cleanDatabase(){ 业务逻辑 } }
2、注入任务
services.Register(typeof(CleanJob))
如何能够通过这样的方式实现是最好的,但是现实是NetCore的quart.net现在还不支持这样的定义方式,java好像是可以的。
那有没有其他类似的方式可以实现上面的效果呢?
我给大家推荐一种方式
案例说明
1、定义一个初始化配置的服务注册
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)); }
2、ConfigureServices中注册
//quartz 定时服务 services.AddQuartz(q => { q.UseMicrosoftDependencyInjectionScopedJobFactory(); q.AddJobAndTrigger<TestJob>(configuration); });
3、配置文件定义cron表达式
"Quartz": { "Default": { //5秒钟执行一次 "TestJob":"0/5 * * * * ? *" } }
4、执行测试
测试结果正确,每五秒钟输出文本
参考
在ASP.NET Core中创建基于Quartz.NET托管服务轻松实现作业调度
最后
本文到此结束,希望对你有帮助 😃
如果还有什么疑问或者建议,可以多多交流,原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。
更多精彩技术文章汇总在我的 公众号【程序员工具集】,持续更新,欢迎关注订阅收藏。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
iPhone被曝存在安全隐患,iOS 14.7最新版本疑似也受影响
7月20日,苹果发布了iOS 14.7更新版本,但随后苹果被曝存在安全漏洞,攻击者通过恶意软件就能窃取用户信息和邮件,且无需用户交互。事件一出,立马登上了微博热搜榜,足以见得该漏洞的严重性。 据国外机构Amnesty International发布的报告显示,iPhone存在严重漏洞,攻击者可以入侵运行iOS 14.6系统的iPhone 12,但尚未明确iOS 14.7 系统中漏洞是否已经修复。 NSO Group的Pegasus间谍软件通过iMessage零点击攻击可以成功感染iPhone 11和 iPhone 12机型,受影响的iPhone设备不计其数。iPhone如果感染该恶意软件,不需要用户点击链接,攻击者就能窃取信息和邮件,甚至可以控制手机麦克风摄像头,进行实时录音窃听。 报告中提及,“这些攻击让世界各地的活动家、记者和政治家面临被监控行踪、个人信息窃取的风险。这是一个全球性的问题——任何人和每个人都处于危险之中,甚至像苹果这样的科技巨头也难以应对大规模的监控。“ 有些政府部门会使用NSO Group软件,黑客可以用苹果不知道的方法窃取数据,即使iPhone软件保持在最新状态...
- 下一篇
OSChina还是不是技术人的交流社区?
离上次在OSChina上写博客已经将近6年了,当初在OSChina上分享对技术的思考和探讨开源技术,确实认识了很多同道中人。当初的OSChina和CSDN是国内两大技术社区,为什么没有选择CSDN是因为它的商业化过于严重,首页基本是广告或者其他商业实体的技术推广,这不是技术人的社区,是在获得了技术人的流量之后,出卖了作为技术社区的本质,所以那个时候我选择来了OSChina,因为这里可以真真实实的看到是一群技术人在交流,在分享自己的心得,同时也促进了很多线下交流的机会。但是今天我再次来到OSChina,我发现变了,变成了我不认识的OSChina,变成了另一个CSDN。我不知道是我落伍了,还是大家都被商业给淹没了,这个@红薯应该能够给出答案。 上面这个图和我六年前看到的是完全不一样的,六年前的博主是真的技术个人,而不是现在成了各个大厂的PR阵地,这已经不是一个开源技术社区该有的现象,因为开源的本质是发挥大众的力量参与到技术社区中来,而不是凸显某个商业公司的技术实力,以及为了给商业公司招聘去做PR的场地。这已经不是我当初看到的OSChina。 从一个社区论坛的这6年变化,也就不难发现...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Hadoop3单机部署,实现最简伪集群
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2整合Thymeleaf,官方推荐html解决方案