Net Core2.0 基于QuartzNet任务管理系统
Net Core2.0 基于QuartzNet任务管理系统
Quartz.NET官网地址:https://www.quartz-scheduler.net/
Quartz.NET文档地址:https://www.quartz-scheduler.net/documentation/index.html
Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。它有很多特征,如:数据库支持,集群,插件,支持cron-like表达式等等。
现在Quartz.NET3.0已支持Asp.Net Core,3.0新功能如下:
新功能
- 具有异步/等待支持的基于任务的作业,内部以异步/等待方式工作
- 支持.NET Core / netstandard 2.0和.NET Framework 4.5.2及更高版本
- 通过提供程序名称
SQLite-Microsoft支持Microsoft.Data.Sqlite,旧的提供程序SQLite也仍然有效 - 增加了
SQL Server内存优化表和Quartz.Impl.AdoJobStore.UpdateLockRowSemaphoreMOT的初步支持 Common.Logging从相关性中删除- 从
ILMerge进程中删除的C5集合不再需要 - 在插件启动时添加对作业调度XML文件的急切验证的支持
- 在
TimeZoneUtil中添加对额外的自定义时区解析器功能的支持
变化
- 作业和插件现在位于独立的程序集
NuGet包Quartz.Jobs和Quartz.Plugins中 - ADO.NET提供者名称已被简化,提供者名称没有版本,例如
SqlServer-20 => SqlServer - API方法已被重新使用,主要使用
IReadOnlyCollection,这隐藏了两个HashSets和List小号 LibLog一直隐藏于内部(ILog等),就像它原本打算的那样SimpleThreadPool消失了,旧的拥有的线程消失了- 调度程序方法已更改为基于任务,请记住等待它们
IJob接口现在返回一个任务- 一些
IList属性已更改为IReadOnlyList以正确反映意图 SQL Server CE支持已被删除DailyCalendar现在将日期时间用于排除的日期,并具有ISet接口来访问它们IObjectSerializer有新的方法,void Initialize(),必须实现IInterruptableJob取消了上下文的CancellationToken
Quartz API的关键接口和类是:
IScheduler- 与调度程序交互的主要API。IJob- 您希望由调度程序执行的组件实现的接口。IJobDetail- 用于定义作业的实例。ITrigger- 定义执行给定Job的时间表的组件。JobBuilder- 用于定义/构建定义作业实例的JobDetail实例。TriggerBuilder- 用于定义/构建触发器实例
一、Quartz.NET基本使用
1、新建Asp.Net Core 项目,使用NuGet添加Quartz,或使用程序包管理器引用,命令如下:
Install-Package Quartz
如果你想添加JSON序列化,只需要以同样的方式添加Quartz.Serialization.Json包。
2、简单实例,代码如下:
using Five.QuartzNetJob.ExecuteJobTask.Service;
using Quartz;
using Quartz.Impl;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Text;
using System.Threading.Tasks; namespace Five.QuartzNetJob.Web.Controllers
{
public class TestTask
{
public async Task StartTestAsync()
{
try
{
// 从工厂中获取调度程序实例
NameValueCollection props = new NameValueCollection
{
{ "quartz.serializer.type", "binary" }
};
StdSchedulerFactory factory = new StdSchedulerFactory(props);
IScheduler scheduler = await factory.GetScheduler(); // 开启调度器
await scheduler.Start(); // 定义这个工作,并将其绑定到我们的IJob实现类
IJobDetail job = JobBuilder.Create<HelloJob>()
.WithIdentity("job1", "group1")
.Build(); // 触发作业立即运行,然后每10秒重复一次,无限循环
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("trigger1", "group1")
.StartNow()
.WithSimpleSchedule(x => x
.WithIntervalInSeconds(10)
.RepeatForever())
.Build(); // 告诉Quartz使用我们的触发器来安排作业
await scheduler.ScheduleJob(job, trigger); // 等待60秒
await Task.Delay(TimeSpan.FromSeconds(60)); // 关闭调度程序
await scheduler.Shutdown();
}
catch (SchedulerException se)
{
await Console.Error.WriteLineAsync(se.ToString());
}
}
}
}
HelloJob内容如下:
using Quartz;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks; namespace Five.QuartzNetJob.ExecuteJobTask.Service
{
public class HelloJob : IJob
{
public Task Execute(IJobExecutionContext context)
{
Console.Out.WriteLineAsync("Greetings from HelloJob!");
return Task.CompletedTask;
}
}
}
执行效果如下:

注:Quartz的版本3.0.3中删除了IJob实现的异地调用,也就是不支持async、await异步调用,3.0.2版本支持异步调用。
二、触发器类型
1、SimpleTrigger触发器(简单触发器)
SimpleTrigger的属性包括:开始时间和结束时间,重复计数和重复间隔。重复计数可以是零,一个正整数或常数值SimpleTrigger.RepeatIndefinitely。重复时间间隔属性必须是TimeSpan.Zero或正的TimeSpan值。请注意,重复间隔为0会导致触发器的“重复计数”触发同时发生。
SimpleTrigger实例使用TriggerBuilder(用于触发器的主属性)和WithSimpleSchedule扩展方法(用于SimpleTrigger特定的属性)构建。
在特定的时间内建立触发器,无需重复,代码如下:
// 触发器构建器默认创建一个简单的触发器,实际上返回一个ITrigger
ISimpleTrigger trigger = (ISimpleTrigger)TriggerBuilder.Create()
.WithIdentity("trigger1", "group1")
.StartAt(DateTime.Now) //指定开始时间为当前系统时间
.ForJob("job1", "group1") //通过JobKey识别作业
.Build();
在特定的时间建立触发器,然后每十秒钟重复十次:
// 触发器构建器默认创建一个简单的触发器,实际上返回一个ITrigger
ITrigger trigger = trigger = TriggerBuilder.Create()
.WithIdentity("trigger2", "group2")
.StartAt(DateTime.Now) // 指定开始时间
.WithSimpleSchedule(x => x
.WithIntervalInSeconds(10)
.WithRepeatCount(10)) // 请注意,重复10次将总共重复11次
.ForJob("job2", "group2") //通过JobKey识别作业
.Build();
构建一个触发器,将在未来五分钟内触发一次:
// 触发器构建器默认创建一个简单的触发器,实际上返回一个ITrigger
ITrigger trigger = trigger = (ISimpleTrigger)TriggerBuilder.Create()
.WithIdentity("trigger3", "group3")
.StartAt(DateBuilder.FutureDate(5, IntervalUnit.Minute)) //使用DateBuilder将来创建一个时间日期
.ForJob("job3", "group3") //通过JobKey识别作业
.Build();
建立一个现在立即触发的触发器,然后每隔五分钟重复一次,直到22:00:
// 触发器构建器默认创建一个简单的触发器,实际上返回一个ITrigger
ITrigger trigger = trigger = TriggerBuilder.Create()
.WithIdentity("trigger4", "group4")
.WithSimpleSchedule(x => x
.WithIntervalInMinutes(5)//每5秒执行一次
.RepeatForever())
.EndAt(DateBuilder.DateOf(22, 0, 0))//晚上22点结束
.Build();
建立一个触发器,在一个小时后触发,然后每2小时重复一次:
// 触发器构建器默认创建一个简单的触发器,实际上返回一个ITrigger
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("trigger5") // 由于未指定组,因此“trigger5”将位于默认分组中
.StartAt(DateBuilder.EvenHourDate(null)) // 获取下个一小时时间
.WithSimpleSchedule(x => x
.WithIntervalInHours(2)//执行间隔2小时
.RepeatForever())
.Build();
因此简单的任务调度使用SimpleTrigger完全够用,如果SimpleTrigger还是不能满足您的需求请往下看。
2、CronTrigger触发器
如果你需要一个基于类似日历的概念而不是精确指定的SimpleTrigger时间间隔的工作调度计划,CronTriggers通常比SimpleTrigger更有用。
使用CronTrigger,您可以在每周一,周三的上午9点至上午10点之间指定开始时间表,例如“每星期五中午”或“每个工作日和上午9点30分”,或者“每5分钟”和星期五”。
即使如此,就像SimpleTrigger一样,CronTrigger有一个startTime,它指定了时间表的生效时间,还有一个(可选的)endTime,用于指定应该停止时间表的时间。
这里不在详细介绍Cron。
Cron表达式在线生成器:http://cron.qqe2.com/
Cron表达式详细介绍:https://www.jianshu.com/p/e9ce1a7e1ed1
每天早上8点到下午5点建立一个触发器,每隔一分钟就会触发一次:
// 触发器构建器默认创建一个简单的触发器,实际上返回一个ITrigger
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("Job1", "group1")
.WithCronSchedule("0 0/2 8-17 * * ?")//使用Cron表达式
.ForJob("Job1", "group1")
.Build();
建立一个触发器,每天在上午10:42开始执行:
// 触发器构建器默认创建一个简单的触发器,实际上返回一个ITrigger
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("Job2", "group2")
.WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(10, 42)) // 在这里使用CronScheduleBuilder的静态辅助方法
.ForJob("Job2", "group2")
.Build();
构建一个触发器,将在星期三上午10:42在除系统默认值之外的TimeZone中触发:
// 触发器构建器默认创建一个简单的触发器,实际上返回一个ITrigger
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("Job3", "group3")
.WithCronSchedule("0 42 10 ? * WED", x => x
.InTimeZone(TimeZoneInfo.FindSystemTimeZoneById("Central America Standard Time")))
.ForJob("Job3", "group3")
.Build();
总结: Quartz.NET的3.0版本跟之前的版本api接口变化并不大。只是在3.0版本中添加了异步调用,并支持.net core。简单的任务调度使用官网中的实例即可满足需求。
三、后端项目管理
在网上找到很多关于asp.net 的任务管理,但没有找到.net core 相关的后端任务管理。
我就根据官网还有网上dalao开源分享的项目实现了个简单的后端任务。
这里也开源出来让园区dalao批评指导。欢迎各位dalao留言批评!
项目地址:https://github.com/YANGKANG01/QuartzNetJob
项目结构
项目使用asp.net core 2.0--->adminlte-2.4.2-->SqlSugar-4.6.4.3。
数据库表可使用SqlSugar来生成。
public IActionResult Index()
{
//生成表
//var db = DataHelper.GetInstance();
//db.CodeFirst.InitTables(typeof(OperateLog), typeof(OperateLog));
return View();
}
结构如下:

Five.QuartzNetJob.DataService.DataHelper----------------------------------是ORM层,使用的是开源框架SqlSugar(官网地址:http://www.codeisbug.com/Doc/8)
Five.QuartzNetJob.DataService.Models---------------------------------------是实体类
Five.QuartzNetJob.ExecuteJobTask.Service---------------------------------IJob实现层
QuartzNet.Entity---------------------------------------------------------------------调度中心相关实体类
QuartzNet2.Core--------------------------------------------------------------------非.Net Core版本的调度管理中心,使用的是.net framework 4.6
Five.QuartzNetJob.Utils.Tool-----------------------------------------------------通用工具类库
Five.QuartzNetJob.Web-----------------------------------------------------------后端
项目很简单,就只实现了增删改查。
统一管理任务调度,项目运行时开启任务调度并执行已开启的任务。
因为项目太过于简单,就不在详细介绍。
下面贴出任务调度中心代码,欢迎各位dalao发表意见:
总结:
开发已个小项目搞了好久才搞完,期间零零散散的开发,还是太懒散了!
平时积累不够,还是太菜了!!!!!
Net Core2.0 基于QuartzNet任务管理系统的更多相关文章
- Asp.Net Core2.0 基于QuartzNet任务管理系统
Quartz.NET官网地址:https://www.quartz-scheduler.net/ Quartz.NET文档地址:https://www.quartz-scheduler.net/doc ...
- .Net Core2.0基于DbContext,IActionFilter过滤器实现全局UOW,不使用TransactionScope
抛弃TransactionScope 之前实现过类似功能是使用的TransactionScope,总碰到这样那样的问题,新项目迁移到.net core2.0下,果断抛弃之前的写法,因为DbContex ...
- Asp.Net Core 基于QuartzNet任务管理系统
之前一直想搞个后台任务管理系统,零零散散的搞到现在,也算完成了. 这里发布出来,请园里的dalao批评指导! 废话不多说,进入正题. github地址:https://github.com/YANGK ...
- Asp.Net Core 基于QuartzNet任务管理系统(这是一篇用来水的随笔)
之前一直想搞个后台任务管理系统,零零散散的搞到现在,也算完成了. 废话不多说,进入正题. github地址:https://github.com/YANGKANG01/QuartzNetJob 一.项 ...
- Centos7.2下Nginx配置SSL支持https访问(站点是基于.Net Core2.0开发的WebApi)
准备工作 1.基于nginx部署好的站点(本文站点是基于.Net Core2.0开发的WebApi,有兴趣的同学可以跳http://www.cnblogs.com/GreedyL/p/7422796. ...
- 前端基于react,后端基于.net core2.0的开发之路(1) 介绍
文章提纲目录 1.前端基于react,后端基于.net core2.0的开发之路(1) 介绍 2.前端基于react,后端基于.net core2.0的开发之路(2) 开发环境的配置,注意事项,后端数 ...
- 前端基于react,后端基于.net core2.0的开发之路(2) 开发环境的配置,注意事项,后端数据初始化
前端环境配置 项目介绍文章:前端基于react,后端基于.net core2.0的开发之路(1) 介绍 1.VSCode安装 下载地址:https://code.visualstudio.com/Do ...
- NET Core2.0 Memcached踩坑,基于EnyimMemcachedCore整理MemcachedHelper帮助类。
DotNetCore2.0下使用memcached缓存. Memcached目前微软暂未支持,暂只支持Redis,由于项目历史原因,先用博客园开源项目EnyimMemcachedCore,后续用到的时 ...
- net core体系-web应用程序-4asp.net core2.0 项目实战(任务管理系统)-2项目搭建
系统要求 首先建议采用 Windows 10 专业版/企业版/教育版,且必须是64位操作系统,原因是docker装起来比较方便,Win7装起来比较麻烦,且不确定是否有其他问题(自己没有实践过) 其次W ...
随机推荐
- Android Studio 字体大小和背景色的设置
豆绿色的RGB值:#C7EDCC 1.打开Android Studio——>Ctrl+Alt+s 或者 File——>Settings 2.在弹窗中选中“Colors&Fonts” ...
- linux 几个逼格高实用的命令
1.xargs [root@gdpsq1x25 log]# find . -type f -name "*.log" |sort -rn./yum.log./sssd/sssd_s ...
- 「LOJ#10072」「一本通 3.2 例 1」Sightseeing Trip(无向图最小环问题)(Floyd
题目描述 原题来自:CEOI 1999 给定一张无向图,求图中一个至少包含 333 个点的环,环上的节点不重复,并且环上的边的长度之和最小.该问题称为无向图的最小环问题.在本题中,你需要输出最小环的方 ...
- ACM学习历程——UVA11111 Generalized Matrioshkas(栈)
Description Problem B - Generalized Matrioshkas Problem B - Generalized Matrioshkas Vladimir wo ...
- P1150 Peter的烟
题目描述 Peter有n根烟,他每吸完一根烟就把烟蒂保存起来,k(k>1)个烟蒂可以换一个新的烟,那么Peter最终能吸到多少根烟呢? 输入输出格式 输入格式: 每组测试数据一行包括两个整数n( ...
- bzoj 3501 PA2008 Cliquers Strike Back —— 贝尔数
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3501 用贝尔三角预处理贝尔数,拆模数并在 \( p \) 进制下使用公式,因为这样每次角标增 ...
- hdu 1521 排列组合 —— 指数型生成函数
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1521 标准的指数型生成函数: WA了好几遍,原来是多组数据啊囧: 注意精度,直接强制转换(int)是舍去小 ...
- 【转】Pro Android学习笔记(三):了解Android资源(上)
在Android开发中,资源包括文件或者值,它们和执行应用捆绑,无需在源代码中写死,因此我们可以改变或替换他们,而无需对应用重新编译. 了解资源构成 参考阅读Android学习笔记(三八):资源res ...
- Jasper:推送 API
ylbtech-Jasper:推送 API Control Center 还维护一个“推送 API”系统,一旦发生特定事件,就会向应用程序发送编程通知.例如,您可能选择在设备接近流量上限时收到通知.或 ...
- 制作HUD
转自:http://www.cnblogs.com/NEOCSL/archive/2012/03/05/2380341.html 1. HUD不仅仅能提供基本的显示信息给玩家,例如玩家的生命值等.在I ...