搭建基于Quartz组件的定时调度任务

先在package包项目下,添加Quartz定时器组件:

新建类库项目Wsk.Core.QuartzNet,并且引用包类库项目。然后新建一个中间调度类,叫QuartzMiddleJob:

中间Job源码:

 public class QuartzMiddleJob : IJob{private readonly IServiceProvider _serviceProvider;public QuartzMiddleJob(IServiceProvider serviceProvider){_serviceProvider = serviceProvider;}public async Task Execute(IJobExecutionContext context){using (var scope = _serviceProvider.CreateScope()){var jobType = context.JobDetail.JobType;var job = scope.ServiceProvider.GetRequiredService(jobType) as IJob;await job.Execute(context);}}}

View Code

新建一个Job工厂类,叫WeskyJobFactory,用来获取刚刚创建的中间调度类的服务:

新建一个通用执行计划类,叫WeskyJobSchedule,用于每次任务都通过该计划进行生成:

计划类和枚举源码:

 public class WeskyJobSchedule{public WeskyJobSchedule(Type jobType, string cronExpression){this.JobType = jobType ?? throw new ArgumentNullException(nameof(jobType));CronExpression = cronExpression ?? throw new ArgumentNullException(nameof(cronExpression));}/// <summary>/// Job类型/// </summary>public Type JobType { get; private set; }/// <summary>/// Cron表达式/// </summary>public string CronExpression { get; private set; }/// <summary>/// Job状态/// </summary>public JobStatus JobStatu { get; set; } = JobStatus.Init;}/// <summary>/// 运行状态/// </summary>public enum JobStatus : byte{[Description("Initialization")]Init = 0,[Description("Running")]Running = 1,[Description("Scheduling")]Scheduling = 2,[Description("Stopped")]Stopped = 3,}

View Code

现在添加一个任务,新建任务类 MyJobs,并且继承自IJob,然后在Excute方法里面,就是该任务执行调度时候会进去执行的了:

似乎上面哪儿感觉不太对,咱们把原来的Job工厂里面到代码稍微调整下如下:

NewJob源码:

 public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler){return _serviceProvider.GetRequiredService(bundle.JobDetail.JobType) as IJob;}

现在新增一个静态类QuartzJobService,用来当做调度任务的中间启动项,并且把有关的一些服务注册进来:

对应源码:

  public static class QuartzJobService{public static void AddQuartzJobService(this IServiceCollection services){if (services == null){throw new ArgumentNullException(nameof(services));}services.AddSingleton<IJobFactory, WeskyJobFactory>();services.AddSingleton<ISchedulerFactory, StdSchedulerFactory>();services.AddSingleton<QuartzMiddleJob>();services.AddSingleton<MyJobs>();services.AddSingleton(new WeskyJobSchedule(typeof(MyJobs), "0/1 * * * * ? "));services.AddHostedService<WeskyJobHostService>();}}

最后,还少了个启动项,用来程序启动的时候,进行启动定时调度任务。新建类 WeskyJobHostService ,并且新建创建调度任务方法 CreateJob和触发器方法CreateTrigger:

然后,在开始和结束方法内:

以上源码如下:

  public class WeskyJobHostService: IHostedService{private readonly ISchedulerFactory _schedulerFactory;private readonly IJobFactory _jobFactory;private readonly IEnumerable<WeskyJobSchedule> _jobSchedules;public WeskyJobHostService(ISchedulerFactory schedulerFactory, IJobFactory jobFactory, IEnumerable<WeskyJobSchedule> jobSchedules){_schedulerFactory = schedulerFactory ?? throw new ArgumentNullException(nameof(schedulerFactory));_jobFactory = jobFactory ?? throw new ArgumentNullException(nameof(jobFactory));_jobSchedules = jobSchedules ?? throw new ArgumentNullException(nameof(jobSchedules));}public IScheduler Scheduler { get; set; }public async Task StartAsync(CancellationToken cancellationToken){Scheduler = await _schedulerFactory.GetScheduler(cancellationToken);Scheduler.JobFactory = _jobFactory;foreach (var jobSchedule in _jobSchedules){var job = CreateJob(jobSchedule);var trigger = CreateTrigger(jobSchedule);await Scheduler.ScheduleJob(job, trigger, cancellationToken);jobSchedule.JobStatu = JobStatus.Scheduling;}await Scheduler.Start(cancellationToken);foreach (var jobSchedule in _jobSchedules){jobSchedule.JobStatu = JobStatus.Running;}}public async Task StopAsync(CancellationToken cancellationToken){await Scheduler?.Shutdown(cancellationToken);foreach (var jobSchedule in _jobSchedules){jobSchedule.JobStatu = JobStatus.Stopped;}}private static IJobDetail CreateJob(WeskyJobSchedule schedule){var jobType = schedule.JobType;return JobBuilder.Create(jobType).WithIdentity(jobType.FullName).WithDescription(jobType.Name).Build();}private static ITrigger CreateTrigger(WeskyJobSchedule schedule){return TriggerBuilder.Create().WithIdentity($"{schedule.JobType.FullName}.trigger").WithCronSchedule(schedule.CronExpression).WithDescription(schedule.CronExpression).Build();}}

View Code

切回QuartzJobService,在 AddQuartzJobService 方法的最下方,添加上面启动服务的注册:

最后,在启动项目里面,添加对Wsk.CoreQuartz项目的引用,然后在WskService服务类下,添加对AddQuartzJobService服务的注册:

启动项目,看看效果:

 

由此可见,我们设置的每秒一次触发效果达成。为了检验是不是可以避免同一个调度任务产生并发,在调度任务方法里面,设置一个延时,看看效果:

运行结果:

说明在当前任务还没有完成的情况下,不会重复进入。如果要允许重复进,只需要把类上面的DisallowConcurrentExecution 标签注释掉就可以。

现在还原回去,然后在Cron表达式改写成定时10秒,看看效果:

运行结果:

以上就是本篇使用QuartzNet的全部内容,仅用于入门参考。对于其他定时用法、以及各种比较飘的使用,各位大佬可以自行变种。如果有什么建议或意见,也欢迎留言~~

十七、.net core(.NET 6)搭建基于Quartz组件的定时调度任务相关推荐

  1. android mvvm框架搭建_轻松搭建基于JetPack组件的MVVM框架

    原文链接:轻松搭建基于JetPack组件的MVVM框架 - 掘金 Brick github gitee 介绍 辅助android开发者搭建基于JetPack组件构建MVVM框架的注解处理框架.通过注解 ...

  2. zk和quartz实现分布式定时调度

    zk和quartz实现分布式定时调度 https://blog.csdn.net/lanjian056/article/details/52711318

  3. springmvc+quartz简单实现定时调度

    一.简介:Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.Quartz可以用来创建简单或为运行十 ...

  4. 定时调度系列之Quartz.Net详解

    一. 背景 我们在日常开发中,可能你会遇到这样的需求:"每个月的3号给用户发信息,提醒用户XXX "."每天的0点需要统计前一天的考勤记录"."每个月 ...

  5. 网站框架搭建——基于Django框架的天天生鲜电商网站项目系列博客(二)

    系列文章目录 需求分析--基于Django框架的天天生鲜电商网站项目系列博客(一) 网站框架搭建--基于Django框架的天天生鲜电商网站项目系列博客(二) 用户注册模块--基于Django框架的天天 ...

  6. 基于 Quartz 开发企业级任务调度应用--转

    Quartz 基本概念及原理 Quartz Scheduler 开源框架 Quartz 是 OpenSymphony 开源组织在任务调度领域的一个开源项目,完全基于 Java 实现.该项目于 2009 ...

  7. 基于 Quartz 开发企业级任务调度应用

    简介: Quartz 是 OpenSymphony 开源组织在任务调度领域的一个开源项目,完全基于 Java 实现.作为一个优秀的开源调度框架,Quartz 具有功能强大,应用灵活,易于集成的特点.本 ...

  8. quartz (一) 基于 Quartz 开发企业级任务调度应用

    本文转自:http://www.ibm.com/developerworks/cn/opensource/os-cn-quartz/ Quartz 基本概念及原理 Quartz Scheduler 开 ...

  9. 一行代码完成定时任务调度,基于Quartz的UI可视化操作组件 GZY.Quartz.MUI

    前言 之前发布过第一个版本,有兴趣的可以去看看: NET Core 基于Quartz的UI可视化操作组件 GZY.Quartz.MUI 简介 GitHub开源地址:l2999019/GZY.Quart ...

最新文章

  1. 视频防抖 Opencv
  2. python修行之路(六 三级菜单实例)
  3. oracle添加文件,ORACLE---添加控制文件
  4. 联想r720内存频率_锐龙H真给劲儿 联想拯救者R7000 2020首测
  5. Word怎么转换成PDF?
  6. 在系统可编程器件一般使用计算机,eda技术与vhdl复习练习题.docx
  7. 又给人家当分母了,顺便介绍一下GIS领域的顶级国际会议
  8. Vue.js菜鸟教程自学(一)
  9. 【MisakaHookFinder使用方法】关于如何提取一个文字游戏的文本钩子以供翻译的方法
  10. Linux_加密和安全详细介绍
  11. 头像怎么画,日系头像绘画教程
  12. [编程题] 翻转数列--附详细分析思路
  13. 常见CAD/CAM控件大全
  14. Vanilla JavaScript 和 Vue 中的 HTML <template>标签
  15. tl wdr5620虚拟服务器,TP-Link TL-WDR5620无线桥接怎么设置?
  16. 如何正确理解三极管的放大区、饱和区、截止区
  17. 小书匠 导出html,推荐:Markdown编辑软件 --- 小书匠
  18. 用漫画生成器生成AI绘画下的病娇美少女
  19. 百度编辑器上传失败问题--转码问题mb_convert_encoding与iconv
  20. 真正理解傅里叶级数和傅里叶变换

热门文章

  1. 火山PC可视化动态布局工具的使用教程
  2. Python,字符串前缀u r b f
  3. 怎么拯救一个不大靠谱的数据库系统 (5 不靠谱的前生)
  4. 关于科技趋势和未来机会,这8本书告诉你答案
  5. jfif格式怎么改成jpg或png格式?
  6. C语言HeapBottomUP算法,C语言堆的建立Percolate Up and Down
  7. Premiere Pro CC2019安装详细教程
  8. bookxnote,类MarginNote的pc笔记软件,可与anki联合使用
  9. golang mysql 崩溃_使用GoLang与mysql连接失败
  10. conda安装python虚拟环境+配置channels