控制台基于Quartz.Net组件实现定时任务调度(一)
前言:
你曾经需要应用执行一个任务吗?比如现在有一个需求,需要每天在零点定时执行一些操作,那应该怎样操作呢?

这个时候,如果你和你的团队是用.NET编程的话,可以考虑使用Quartz.NET调度器。允许开发人员根据日期间隔来实现任务调度任务。非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等。
Quartz一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植每隔,基于C#写成,可应用于winform、asp.net、asp.net core应用中。提供了巨大的灵活性,是一个更为强大,方便管理,集群部署的作业调度框架。
所以,有时候项目需要在不同时刻,执行一个或很多个不同的作业,你可以用它来完成执行创建简单或复杂的任务调度。
导图:

特性:
1:支持集群,作业分组,作业远程管理。
2:自定义精细的时间触发器,使用简单,作业和触发分离。
3:数据库支持,可以寄宿Windows服务,WebSite,winform等。
概念:
Scheduler 作业调度器

所有的scheduler都应该由SchedulerFactory来创建
//创建scheduler
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
IJob 作业接口,继承并实现Execute, 编写执行的具体作业逻辑。

通过实现IJob接口来使你的.NET组件可以很简单地被scheduler执行
public class ConsoleJob : IJob
{
public Task Execute(IJobExecutionContext context)
{
return Console.Out.WriteLineAsync($"执行作业");
}
}
JobBuilder 根据设置,生成一个详细作业信息(JobDetail)。
JobBuilder是一个建造者模式,链式建造。通过静态方法构建一个JobBuilder实例,然后再调用类方法Build()创建一个IJobDetail的实现。
public static JobBuilder Create(Type jobType)
{
JobBuilder b = new JobBuilder();
b.OfType(jobType);
return b;
}
TriggerBuilder 根据规则,生产对应的Trigger,触发器可以规划执行任务

通过静态方法构建一个TriggerBuilder实例,然后再调用类方法Build()创建一个ITrigger的实现。
public static TriggerBuilder Create()
{
return new TriggerBuilder();
}
根据任务设置触发的开始时间和结束时间
/// <summary>
/// 开始时间
/// </summary>
/// <param name="startTimeUtc"></param>
/// <returns></returns>
public TriggerBuilder StartAt(DateTimeOffset startTimeUtc)
{
startTime = startTimeUtc;
return this;
}
/// <summary>
/// 结束时间
/// </summary>
/// <param name="endTimeUtc"></param>
/// <returns></returns>
public TriggerBuilder EndAt(DateTimeOffset? endTimeUtc)
{
endTime = endTimeUtc;
return this;
}
步骤:

1、创建一个ISchedulerFactory,然后并且获取 Scheduler
2、启动 Scheduler
3、创建 job 任务
4、创建 trigger 触发器
5、使用触发器规划执行任务
开始:
注意:
新建一个Quartz项目后,需要安装下面的程序包:
你可以用控制台命令的方式安装
Install-Package Quartz
也可以使用下面这种方式选择安装版本

一、创建一个scheduler的引用:
ISchedulerFactory schedFact = new StdSchedulerFactory();
IScheduler sched = await schedFact.GetScheduler();
二、启动 scheduler:
await sched.Start();
三、实现IJob:
ConsoleJob.cs 实现IJob,在Execute方法里编写要处理的业务逻辑,系统就会按照Quartz的配置,定时处理
/// <summary>
/// 实现IJob,Execute方法里编写要处理的业务逻辑
/// </summary>
public class ConsoleJob : IJob
{
public Task Execute(IJobExecutionContext context)
{
return Console.Out.WriteLineAsync($"ConsoleJob执行工作 在当前时间{DateTime.Now}--上一次执行时间:{DateTime.Now.AddSeconds(-5)}");
}
}
四、创建trigger:(建立一个某个时间点的触发器,并且每5秒执行一次)
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("trigger1", "group1") //触发器 组
.WithSimpleSchedule(x => x.WithIntervalInSeconds().RepeatForever())
.Build();
五、触发器执行任务:
await sched.ScheduleJob(job, trigger);
将几个步骤整合后代码如下:
/// <summary>
/// 任务调度的使用过程
/// </summary>
/// <returns></returns>
public async static Task Run()
{
// 1.创建scheduler的引用
ISchedulerFactory schedFact = new StdSchedulerFactory();
IScheduler sched = await schedFact.GetScheduler(); //2.启动 scheduler
await sched.Start(); // 3.创建 job
IJobDetail job = JobBuilder.Create<ConsoleJob>()
.WithIdentity("job1", "group1")
.Build(); // 4.创建 trigger (创建 trigger 触发器)
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("trigger1", "group1") //触发器 组
.WithSimpleSchedule(x => x.WithIntervalInSeconds().RepeatForever())
.Build(); // 5.使用trigger规划执行任务job (使用触发器规划执行任务)
await sched.ScheduleJob(job, trigger);
}
运行:
间隔5秒执行一次后的效果:

附加:
这里使用的quartz为3.x 版本,整个版本相对于2.0版本进行了大量的修改,正式支持了.NET Core 和async/await
引用张队文章的内容:

总结:
1.其实在实际项目中,可以将上面的方法进行封装处理,形成不同的任务,特别是处理多任务的时候,在不同的job中调用不同的trigger,后续会继续完善开发
2.quartz还有更多的用法,可以参考资料:Quartz.Net官方文档 和 Quartz.Net开源地址
3.项目源码地址
控制台基于Quartz.Net组件实现定时任务调度(一)的更多相关文章
- Window服务基于Quartz.Net组件实现定时任务调度(二)
前言: 在上一章中,我们通过利用控制台实现定时任务调度,已经大致了解了如何基于Quartz.Net组件实现任务,至少包括三部分:job(作业),trigger(触发器),scheduler(调度器). ...
- 基于Quartz实现简单的定时发送邮件
一.什么是Quartz Quartz 是一个轻量级任务调度框架,只需要做些简单的配置就可以使用:它可以支持持久化的任务存储,即使是任务中断或服务重启后,仍可以继续运行.Quartz既可以做为独立的应用 ...
- MVC 使用Quartz.Net组件实现定时计划任务
最近,项目中需要执行一个计划任务,组长就让我了解一下Quartz.net 这个组件,挺简单的一个组件,实现起来特别的方便,灵活,值得推荐给大家一起学习一下这个小工具.以前我有的时候是使用定时器Time ...
- Spring与Quartz的整合实现定时任务调度 以及crontab的用法
最近在研究Spring中的定时任务功能,最好的办法当然是使用Quartz来实现.对于一个新手来说,花了我不少时间,这里我写个笔记,给大家参考. 我使用的是Maven来管理项目,需要的Jar包我给大家贴 ...
- Spring与Quartz的整合实现定时任务调度(转)
源:http://kevin19900306.iteye.com/blog/1397744 最近在研究Spring中的定时任务功能,最好的办法当然是使用Quartz来实现.对于一个新手来说,花了我不少 ...
- Spring与Quartz的整合实现定时任务调度
摘自: http://kevin19900306.iteye.com/blog/1397744 最近在研究Spring中的定时任务功能,最好的办法当然是使用Quartz来实现.对于一个新手来说,花了我 ...
- Spring与Quartz的整合实现定时任务调度(转)
最近在研究Spring中的定时任务功能,最好的办法当然是使用Quartz来实现.对于一个新手来说,花了我不少时间,这里我写个笔记,给大家参考.我使用的是Maven来管理项目,需要的Jar包我给大家贴出 ...
- 基于ASP.NET MVC(C#)和Quartz.Net组件实现的定时执行任务调度
http://www.cnblogs.com/bobositlife/p/aspnet-mvc-csharp-quartz-net-timer-task-scheduler.html 在之前的文章&l ...
- 一行代码完成定时任务调度,基于Quartz的UI可视化操作组件 GZY.Quartz.MUI
前言 之前发布过第一个版本,有兴趣的可以去看看: NET Core 基于Quartz的UI可视化操作组件 GZY.Quartz.MUI 简介 GitHub开源地址:l2999019/GZY.Quart ...
随机推荐
- 机器学习经典算法之PageRank
Google 的两位创始人都是斯坦福大学的博士生,他们提出的 PageRank 算法受到了论文影响力因子的评价启发.当一篇论文被引用的次数越多,证明这篇论文的影响力越大.正是这个想法解决了当时网页检索 ...
- jekyll搭建个人博客1
目录 配置环境 使用模板 配置环境 简介 jekyll是一个简单的免费的,生成静态网页的工具,不需要数据库支持.但是可以配合第三方服务,例如Disqus.最关键的是jekyll可以免费部署在Githu ...
- [原创]MySQL数据库查询和LVM备份还原学习笔记记录
一.查询语句类型: 1)简单查询 2)多表查询 3)子查询 4)联合查询 1)简单查询: SELECT * FROM tb_name; SELECT field1,field2 FROM tb_nam ...
- Excel催化剂开源第16波-VSTO开发之脱离传统COM交互以提升性能
在VSTO开发或其他COM技术开发过程中,甚至VBA也是,在和Excel交互中,难免会遇到性能瓶颈问题,COM技术的交互实在太慢,对大量数据读写等操作,耗时太长,容易卡用户界面以为是程序死机等等. 在 ...
- 关于RedirectAttributes 重定向带参数请求问题
@RequestMapping("/delete") public String delete(String id, RedirectAttributes redirectAttr ...
- [剑指offer] 3. 从头到尾打印链表
题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 思路: 利用容器,遍历一遍加入到一个新容器里,然后反置输出. vector 用 reverse stack 则直接一个个出栈 ...
- 俩台服务器搭建redis集群5.0.4
俩台服务器搭建redis集群 1.俩服务器分别新建目录:usr/local/redis-cluster 2.下载源码并解压编译(使用redis版本5.0.4) 3.tar xzf redis-5.0. ...
- 浅谈单点登陆(SSO)
背景 在企业发展初期,企业使用的系统很少,通常一个或者两个,每个系统都有自己的登录模块,运营人员每天用自己的账号登录,很方便. 但随着企业的发展,用到的系统随之增多,运营人员在操作不同的系统时,需要多 ...
- python递归-三元表达式-列表生成式-字典生成式-匿名函数-部分内置函数-04
递归 递归: # 函数在调用阶段直接或间接地又调用了自身 应用场景: # 将列表中的数字依次打印出来(循环的层数是你必须要考虑的点) --> l = [1, [2, [3, [4, [5, ...
- 在Ubuntu中安装Docker和docker的使用
1.在Ubuntu中安装Docker 更新ubuntu的apt源索引 sudo apt-get update 安装包允许apt通过HTTPS使用仓库 sudo apt-get install \ ap ...