NetCore集成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业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
袋鼠云:基于Flink构建实时计算平台的总体架构和关键技术点
数栈是云原生—站式数据中台PaaS,我们在github和gitee上有一个有趣的开源项目:FlinkX,FlinkX是一个基于Flink的批流统一的数据同步工具,既可以采集静态的数据,也可以采集实时变化的数据,是全域、异构、批流一体的数据同步引擎。大家喜欢的话请给我们点个star!star!star! github开源项目:https://github.com/DTStack/flinkx gitee开源项目:https://gitee.com/dtstack_dev_0/flinkx 平台建设背景 传统离线数据开发时效性较差,无法满足快速迭代的互联网需求。伴随着以Flink为代表的实时技术的飞速发展,实时计算越来越多的被企业使用,但是在使用中下面提到的各种问题也随之而来。开发者使用门槛高、产出的业务数据质量没有保障、企业缺少统一平台管理难以维护等。在诸多不利因素的影响下,我们决定利用现有的Flink技术构建一套完整的实时计算平台。 平台总体架构 从总体架构来看,实时计算平台大体可以分为三层,计算平台、调度平台、资源平台。每层承担着相应的功能,同时层于层之间又有交互,符合高内聚、低...
-
下一篇
Zadig 完成 100% 开源:开启软件交付 3.0 时代
经历过流程驱动的 1.0时代,工具驱动的 2.0 时代的,软件开发已经进入到数字业务驱动的 3.0 时代,成为企业生存的命脉。“要想富,先修路” 。开源云原生软件交付产品 Zadig,就是要把路修到企业的门口,让软件工程师不再做修「高速公路」的脏活累活,而是专注自己最擅长的事情:打造业务的数字化「跑车」!阅读 KodeRover 原文 自 7 月初 V1.2.0 版本发布,Zadig 产品完成了 100% 开源,Zadig 能帮我做什么?Zadig 是如何帮助工程师走出“开发 5 分钟,上线 2 小时”的窘境?Zadig 的设计原理又是什么、好在哪里、适合你吗? 两位创始人 Landy 和 Grant Zadig 出镜,为您解析 Zadig 今天,软件交付需要新的思路 我的合伙人 Grant 是个 90 年代中期的老程序员,那个年代他们做像三国演义、西游记这样的 PDA 手游, 1 个开发,1 个 QA, 1 个美工,1 个月搞定,代码封版后烧到 IC 卡里插入 PDA 只能自己玩。而今天手游是上百人经年累月共同开发的结果,复杂度指数级上升。不仅仅游戏,线上化已经在各行各业发生;试想,...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- MySQL数据库在高并发下的优化方案
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Mario游戏-低调大师作品
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合Redis,开启缓存,提高访问速度
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果