简介

  虽然Quartz.NET被园子里的大神们写烂了,自己还是整理了一篇,结尾会附上源码地址。

  Quartz.NET是一款功能齐全的开源作业调度框架,小至的应用程序,大到企业系统都可以适用。Quartz是作者James House用JAVA语言编写的,而Quartz.NET是从Quartz移植过来的C#版本。

  在一般企业,可以利用Quartz.Net框架做各种的定时任务,例如,数据迁移、跑报表等等。

  另外还有一款Hangfire https://www.hangfire.io/,也是作业调度框架,有自带监控web后台,比Quartz.Net更加易用,简单。但是Cron最低只支持到分钟级。然而Hangfire不是今天的主角,有机会再介绍。

简单例子

新建一个控制台项目,通过Nuget管理下载Quartz包

using System;
using System.Collections.Specialized;
using Quartz;
using Quartz.Impl;namespace QuartzDotNetDemo
{class Program{static void Main(string[] args){//创建一个调度器工厂var props = new NameValueCollection{{ "quartz.scheduler.instanceName", "QuartzDotNetDemo" }};var factory = new StdSchedulerFactory(props);//获取调度器var sched =  factory.GetScheduler();sched.Start();//定义一个任务,关联"HelloJob"var job = JobBuilder.Create<HelloJob>().WithIdentity("myJob", "group1").Build();//由触发器每40秒触发执行一次任务var trigger = TriggerBuilder.Create().WithIdentity("myTrigger", "group1").StartNow().WithSimpleSchedule(x => x.WithIntervalInSeconds(40).RepeatForever()).Build();sched.ScheduleJob(job, trigger);}}public class HelloJob : IJob{public void Execute(IJobExecutionContext context){Console.WriteLine("你好");}}
}

View Code

一个简单的调度任务流程如下:

概念

  有几个重要类和概念需要了解一下:

  • IScheduler - 与调度器交互的主要API.
  • IJob -由执行任务实现的接口。
  • IJobDetail - 定义Job实例
  • ITrigger - 按照定义的时间让任务执行的组件.
  • JobBuilder - 用于定义或者创建JobDetai
  • TriggerBuilder -用于定义或生成触发器实例

  他们之间的关系大概如下:

  当有空闲线程同时,到了该执行的时间,那么就会由Trigger去触发绑定的Job执行它的Excute方法,假如这次没执行完,却到了下一次的运行时间,如果有空闲线程就仍然会再次执行。但是如果没有空闲线程,会等到腾出空闲的线程才会执行,但是超过quartz.jobStore.misfireThreshold设置的时间就会放弃这次的运行。

  当然也可以在Job贴上DisallowConcurrentExecution标签让Job进行单线程跑,避免没跑完时的重复执行。

改造

  在第一个简单的demo里是无法良好的在实际中使用,因此我们需要改造一下。

需要的第三方包:

  • Autofac version="4.6.2"
  • Autofac.Extras.Quartz version="3.4.0"
  • Common.Logging version="3.4.1"
  • Common.Logging.Core version="3.4.1"
  • Common.Logging.Log4Net1213 version="3.4.1"
  • log4net version="2.0.3"
  • Newtonsoft.Json version="10.0.3"
  • Quartz version="2.6.1"
  • Topshelf version="4.0.3"
  • Topshelf.Autofac version="3.1.1"
  • Topshelf.Log4Net version="3.2.0"
  • Topshelf.Quartz version="0.4.0.1"

Topshelf

  Topshelf是一款为了方便安装部署在Windows系统下而诞生的宿主框架,它基于控制台项目,为开发人员带来更方便的调试和部署。

  官网:https://topshelf.readthedocs.io/en/latest/index.html

  那我们可以在Program.cs里写入以下代码:

using Topshelf;
using Topshelf.Autofac;namespace QuartzDotNetDemo
{class Program{static void Main(string[] args){HostFactory.Run(config =>{config.SetServiceName(JobService.ServiceName);config.SetDescription("Quartz.NET的demo");config.UseLog4Net();config.UseAutofacContainer(JobService.Container);config.Service<JobService>(setting =>{JobService.InitSchedule(setting);setting.ConstructUsingAutofacContainer();setting.WhenStarted(o => o.Start());setting.WhenStopped(o => o.Stop());});});}}
}

View Code

JobService

  此类用来读取配置信息、初始化调度任务和注入ioc容器

public class JobService{#region 初始化private static readonly ILog Log = LogManager.GetLogger(typeof(JobService));private const string JobFile = "JobsConfig.xml";private static readonly string JobNamespceFormat;public static readonly string ServiceName;private static readonly Jobdetail[] JobList;public static IContainer Container;static JobService(){var job = JobFile.XmlToObject<JobsConfig>();ServiceName = job.Quartz.ServiceName;JobNamespceFormat = job.Quartz.Namespace;JobList = job.Quartz.JobList.JobDetail;Log.Info("Jobs.xml 初始化完毕");InitContainer();} #endregion/// <summary>/// 初始化调度任务/// </summary>/// <param name="svc"></param>public static void InitSchedule(ServiceConfigurator<JobService> svc){svc.UsingQuartzJobFactory(Container.Resolve<IJobFactory>);foreach (var job in JobList){svc.ScheduleQuartzJob(q =>{q.WithJob(JobBuilder.Create(Type.GetType(string.Format(JobNamespceFormat, job.JobName))).WithIdentity(job.JobName, ServiceName).Build);q.AddTrigger(() => TriggerBuilder.Create().WithCronSchedule(job.Cron).Build());Log.InfoFormat("任务 {0} 已完成调度设置", string.Format(JobNamespceFormat, job.JobName));});}Log.Info("调度任务 初始化完毕");}/// <summary>/// 初始化容器/// </summary>private static void InitContainer(){var builder = new ContainerBuilder();builder.RegisterModule(new QuartzAutofacFactoryModule());builder.RegisterModule(new QuartzAutofacJobsModule(typeof(JobService).Assembly));builder.RegisterType<JobService>().AsSelf();var execDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);var files = Directory.GetFiles(execDir, "QuartzDotNetDemo.*.dll", SearchOption.TopDirectoryOnly);if (files.Length > 0){var assemblies = new Assembly[files.Length];for (var i = 0; i < files.Length; i++)assemblies[i] = Assembly.LoadFile(files[i]);builder.RegisterAssemblyTypes(assemblies).Where(t => t.GetInterfaces().ToList().Contains(typeof(IService))).AsSelf().InstancePerLifetimeScope();}Container = builder.Build();Log.Info("IOC容器 初始化完毕");}public bool Start(){Log.Info("服务已启动");return true;}public bool Stop(){Container.Dispose();Log.Info("服务已关闭");return false;}}

View Code

触发器类型

  一共有4种:

  • WithCalendarIntervalSchedule
  • WithCronSchedule
  • WithDailyTimeIntervalSchedule
  • WithSimpleSchedule

  在项目中使用的是WithCronSchedule,因为cron表达式更加灵活、方便。

Cron表达式

字段名 是否必填 值范围 特殊字符
Seconds YES 0-59 , - * /
Minutes YES 0-59 , - * /
Hours YES 0-23 , - * /
Day of month YES 1-31 , - * ? / L W
Month YES 1-12 or JAN-DEC , - * /
Day of week YES 1-7 or SUN-SAT , - * ? / L #
Year NO empty, 1970-2099 , - * /

例子:

  "0 0/5 * * * ?"    ---- 每5分钟触发一次

  "10 0/5 * * * ?"   -----每5分钟触发一次,每分钟10秒(例如:10:00:10 am,10:05:10,等等)

  "0 0/30 8-9 5,20 * ?" ----在每个月的第5到20个小时之间,每隔半小时就会触发一个触发点。请注意,触发器不会在上午10点触发,仅在8点,8点30分,9点和9点30分

BaseJob

  我们定义一个BaseJob写入公共处理逻辑,例如:业务逻辑禁用、公共异常日志消息推送等等。再由具体的Job去继承重写基类的ExecuteJob,简单的适配器模式运用。

public abstract class BaseJob : IJob{protected readonly CommonService CommonService;protected BaseJob(CommonService commonService){CommonService = commonService;}public void Execute(IJobExecutionContext context){//公共逻辑
            CommonService.Enabled();//job逻辑
            ExecuteJob(context);}public abstract void ExecuteJob(IJobExecutionContext context);}

View Code

结束

  最后按照惯例双手奉上demo源码。https://github.com/SkyChenSky/QuartzDotNetDemo.git

  如果错误麻烦在下面评论指出,我会及时修改。

转载于:https://www.cnblogs.com/skychen1218/p/7765823.html

Quartz.NET的使用(附源码)相关推荐

  1. 使用sqlserver搭建高可用双机热备的Quartz集群部署【附源码】

    一般拿Timer和Quartz相比较的,简直就是对Quartz的侮辱,两者的功能根本就不在一个层级上,如本篇介绍的Quartz强大的集群机制,可以采用基于 sqlserver,mysql的集群方案,当 ...

  2. 毕业设计-基于SSM框架大学教务管理平台项目开发实战教程(附源码)

    文章目录 1.项目简介 2.项目收获 3.项目技术栈 4.测试账号 5.项目部分截图 6.常见问题 毕业设计-基于SSM框架大学教务管理平台项目实战教程-附源码 课程源码下载地址:https://do ...

  3. C#共享内存实例 附源码

    原文 C#共享内存实例 附源码 网上有C#共享内存类,不过功能太简单了,并且写内存每次都从开头写.故对此进行了改进,并做了个小例子,供需要的人参考. 主要改进点: 通过利用共享内存的一部分空间(以下称 ...

  4. java中batch基础_详解Spring batch 入门学习教程(附源码)

    详解Spring batch 入门学习教程(附源码) 发布时间:2020-09-08 00:28:40 来源:脚本之家 阅读:99 作者:achuo Spring batch 是一个开源的批处理框架. ...

  5. 炫酷,SpringBoot+Echarts实现用户访问地图可视化(附源码)

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 SpringBoot+Echarts用户访问地图可视化 意义 在常 ...

  6. C#使用Xamarin开发可移植移动应用进阶篇(7.使用布局渲染器,修改默认布局),附源码...

    原文:C#使用Xamarin开发可移植移动应用进阶篇(7.使用布局渲染器,修改默认布局),附源码 前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github. ...

  7. 黯然微信小程序杂记(三):微信小程序实现倒计时功能 附讲解教学 附源码

    黯然微信小程序杂记(三):微信小程序实现倒计时功能 附超详细注释 附源码 一.功能描述 二.界面展示 三.test.wxml代码 四.test.js代码(注释很详细 很易懂) CSDN私信我,有关微信 ...

  8. 黯然微信小程序杂记(二):小程序最新版登录并进行缓存模块的实现 附源码

    黯然微信小程序杂记(二):小程序最新版登录进行缓存模块的实现 附源码 一.功能描述 二.mine.wxml界面图片 三.mine.wxml代码 四.mine.wxss代码 五.mine.js代码 六. ...

  9. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(32)-swfupload多文件上传[附源码]...

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(32)-swfupload多文件上传[附源码] 文件上传这东西说到底有时候很痛,原来的asp.net服务器 ...

  10. 通用权限管理系统组件 中集成多个子系统的单点登录(网站入口方式)附源码

    通用权限管理系统组件 (GPM - General Permissions Manager) 中集成多个子系统的单点登录(网站入口方式)附源码 上文中实现了直接连接数据库的方式,通过配置文件,自定义的 ...

最新文章

  1. 64位环境启用ASP.net 2.0的32位扩展
  2. 汽车票销售系统mysql,jsp683客运汽车票网上售票系统mysql
  3. CV:翻译并解读2019《A Survey of the Recent Architectures of Deep Convolutional Neural Networks》第一章~第三章
  4. 笔记-项目进度管理-复习要点
  5. Unity 利用Coroutine实现跳动数字效果
  6. Elasticsearch 之 数据索引
  7. html span标签 不换行(有时span带中文时候是可以自动换行的)
  8. 非文学翻译理论与实践_2019年北京语言大学翻译学专业考研经验分享
  9. jquery ztree 设置勾选_zTree 勾选checkbox
  10. java倒计时器_Java并发系列5--倒计时器CountDownLatch
  11. python读取excel一行一行的读取_python读取excel数据
  12. 如何使用AutoCAD软件截图?
  13. 微带线特性阻抗计算公式_几种计算微带线特性阻抗的方法.pdf
  14. 看《延禧攻略》学配色与构图
  15. Chrome打包扩展程序错误,清单文件缺失或不可读
  16. 移动电影院新版本新功能新体验
  17. 设计模式“6”大原则!
  18. 七步带你认识计算机视觉(Computer Vision)
  19. centos7.4和ubuntu16.0.4常用命令
  20. 5G射频芯片中的半导体

热门文章

  1. 什么样的摄影题材更能吸引大众的目光?
  2. 一个人长途自驾旅行需要注意什么?
  3. 自驾游,遇陌生夫妻搭车坐了一千多公里,执意要给钱,我能收吗?
  4. 组织体互联网是个啥?
  5. 现在有很多年轻人都不想打工
  6. 小米靠着“便宜”在手机市场中占有一席之地
  7. 安装Windows 10 V1909对CPU有什么要求?
  8. OpenZeppelin集成Truffle编写健壮安全的合约
  9. 进程互斥的软件实现方法
  10. statusBar——状态栏