ASP.NET Corec初步使用Quartz.NET
一、什么是Quartz.NET?
Quartz.NET 是一个功能齐全的开源作业调度系统,可用于从最小的应用程序到大型企业系统。
Quartz.NET是纯净的,它是一个.Net程序集,是非常流行的Java作业调度系统Quartz的C#实现。
二、Quartz.NET可以做什么?
Quartz.NET很多特征,如:数据库支持,集群,插件,支持cron-like表达式等等,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等。
Quartz.NET允许开发人员根据时间间隔(或天)来调度作业。它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联。
Quartz.NET的应用程序可以重用来自不同事件的作业,还可以为一个事件组合多个作业。
我此次选择Quartz.Net使用的版本是 3.3.3
这里强调一点:3.x的版本与2.x的版本使用方式有一定的差别
Quartz.NET官方文档:https://www.quartz-scheduler.net/documentation/quartz-3.x/quick-start.html
三、ASP.NET Core如何使用Quartz.NET?
- 首先我们需要创建一个ASP.NET Core web的项目,创建的过程就不展示了,我创建的是API项目,使用传统三层架构。

- 项目创建好后,我们需要在NuGet包管理器中安装Quartz.AspNetCore和Quartz.Extensions.DependencyInjection


- 与2.x的使用方式不同,因为我使用的版本是3.3.3(此时最新版本)。我们就不像传统的创建调度中心类。传统的是定义作业工厂类【ResetJobFactory】,控制中心类【SchedulerCenter】,以及定期工作类【RegularWork】(如下图)在这就不过多介绍了。

- 只需创建一个定期工作类【RegularWork】,并且继承Quartz.net的IJob接口,I_RegularWork_BLL 能注入到RegularWork内需要UseMicrosoftDependencyInjectionJobFactory.
public class RegularWork : IJob
{ private readonly I_RegularWork_BLL I_bll;
public RegularWork(I_RegularWork_BLL Ibll)
{
I_bll = Ibll;
} public Task Execute(IJobExecutionContext context)
{
Input_RoomType model = new Input_RoomType();
model.currentPage = 1;
model.pageSize = 1;
var result = I_bll.getRoomTypeList(model); return Task.Run(() =>
{
using (StreamWriter sw = new StreamWriter(@"F:/Quartz-NET.txt", true, Encoding.UTF8))
{
sw.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff =>") + JsonConvert.SerializeObject(result));
}
});
}
}
- 在Startup.cs的ConfigureServices方法内通过services去注册RegularWork
//Quartz的工作单元
services.AddTransient<RegularWork>();
- ConfigureServices方法内新增Quartz调度中心。Quartz.Extensions.DependencyInjection提供与Microsoft 依赖注入的集成,虽然Quartz 为作业工厂提供了两个内置替代方案,可以通过调用
UseMicrosoftDependencyInjectionJobFactory或UseMicrosoftDependencyInjectionScopedJobFactory(已弃用)进行配置。但,从 Quartz.NET 3.3.2 开始,默认作业工厂生成的所有作业都是作用域作业,不应再使用UseMicrosoftDependencyInjectionScopedJobFactory。AddJob-新增一个工作单元;StartNow表示作业现在就开始执行;WithInterval用于执行时间策略执行规则;TimeSpan.FromSeconds表示执行的时间间隔, 秒为单位RepeatForever代表重复工作,可以用WithRepeatCount(5)代替RepeatForever,WithRepeatCount(5)代表执行5次//Quartz调度中心
services.AddQuartz(q =>
{
//用于注入
q.UseMicrosoftDependencyInjectionJobFactory();
// 基本Quartz调度器、作业和触发器配置
var jobKey = new JobKey("RegularWork", "regularWorkGroup");
q.AddJob<RegularWork>(jobKey, j => j
.WithDescription("My regular work")
);
q.AddTrigger(t => t
.WithIdentity("Trigger")
.ForJob(jobKey)
.StartNow()
.WithSimpleSchedule(x => x.WithInterval(TimeSpan.FromSeconds(10))//开始秒数 10s
.RepeatForever())//持续工作
.WithDescription("My regular work trigger")
); });
- ConfigureServices方法内新增添加Quartz服务,完整的代码(如下图)
// ASP.NET核心托管-添加Quartz服务器
services.AddQuartzServer(options =>
{
// 关闭时,我们希望作业正常完成
options.WaitForJobsToComplete = false;
});

这时候我们启动项目,定期工作开始执行。这时候的注入是有效的,查询数据后结果打印在F盘下的Quartz-NET.txt文件内(如下图)。

四、Quartz的cron表达式
官方的文档介绍:https://www.quartz-scheduler.net/documentation/quartz-2.x/tutorial/crontrigger.html#format
由7段构成:秒 分 时 日 月 星期 年(可选)
"-" :表示范围 MON-WED表示星期一到星期三
"," :表示列举 MON,WEB表示星期一和星期三
"*" :表是“每”,每月,每天,每周,每年等
"/" :表示增量:0/15(处于分钟段里面) 每15分钟,在0分以后开始,3/20 每20分钟,从3分钟以后开始
"?" :只能出现在日,星期段里面,表示不指定具体的值
"L" :只能出现在日,星期段里面,是Last的缩写,一个月的最后一天,一个星期的最后一天(星期六)
"W" :表示工作日,距离给定值最近的工作日
"#" :表示一个月的第几个星期几,例如:"6#3"表示每个月的第三个星期五(1=SUN...6=FRI,7=SAT)
| Expression | Meaning |
|---|---|
| 0 0 12 * * ? | 每天中午12点触发 |
| 0 15 10 ? * * | 每天上午10:15触发 |
| 0 15 10 * * ? | 每天上午10:15触发 |
| 0 15 10 * * ? * | 每天上午10:15触发 |
| 0 15 10 * * ? 2005 | 2005年的每天上午10:15触发 |
| 0 * 14 * * ? | 在每天下午2点到下午2:59期间的每1分钟触发 |
| 0 0/5 14 * * ? | 在每天下午2点到下午2:55期间的每5分钟触发 |
| 0 0/5 14,18 * * ? | 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 |
| 0 0-5 14 * * ? | 在每天下午2点到下午2:05期间的每1分钟触发 |
| 0 10,44 14 ? 3 WED | 每年三月的星期三的下午2:10和2:44触发 |
| 0 15 10 ? * MON-FRI | 周一至周五的上午10:15触发 |
| 0 15 10 15 * ? | 每月15日上午10:15触发 |
| 0 15 10 L * ? | 每月最后一日的上午10:15触发 |
| 0 15 10 L-2 * ? | Fire at 10:15am on the 2nd-to-last last day of every month |
| 0 15 10 ? * 6L | 每月的最后一个星期五上午10:15触发 |
| 0 15 10 ? * 6L | Fire at 10:15am on the last Friday of every month |
| 0 15 10 ? * 6L 2002-2005 | 2002年至2005年的每月的最后一个星期五上午10:15触发 |
| 0 15 10 ? * 6#3 | 每月的第三个星期五上午10:15触发 |
| 0 0 12 1/5 * ? | Fire at 12pm (noon) every 5 days every month, starting on the first day of the month. |
| 0 11 11 11 11 ? | Fire every November 11th at 11:11am. |
ASP.NET Corec初步使用Quartz.NET的更多相关文章
- ASP.NET MVC5 实现基于Quartz.NET任务调度
工作之余.技术?.记是不可能记住的. 只有写点东西 才能维持得了生活这样子的.好早就像写一篇关于任务调度的文章.终究是太懒了 一.Quartz.NET介绍 Quartz.NET是一个强大.开源.轻量的 ...
- 在ASP.NET MVC4中使用Quartz.NET执行定时任务
本篇在ASP.NET MVC下实践使用Quartz.NET执行定时任务. 首先通过NuGet安装Quartz.NET. 使用Quartz.NET的大致思路是:1.实现IJob接口,定义具体要做的事情2 ...
- ASP.NET Core托管运行Quartz.NET作业调度详解
Quartz.NET这么NB的作业调度系统,不会还行? 今天介绍一下Quartz.NET的托管运行,官网传送门. 一.前言 Quartz.NET,按官网上的说法,是一款功能齐全的任务调度系统,从小 ...
- 开发 ASP.NET vNext 初步总结(使用Visual Studio 14 CTP1)
新特性: vNext又称MVC 6.0,不再需要依赖System.Web,占用的内存大大减少(从前无论是多么简单的一个请求,System.Web本身就要占用31KB内存). 可以self-host模式 ...
- 开发 ASP.NET vNext 初步总结(使用Visual Studio 2015 Preview )
新特性: vNext又称MVC 6.0,不再需要依赖System.Web,占用的内存大大减少(从前无论是多么简单的一个请求,System.Web本身就要占用31KB内存). 可以self-host模式 ...
- asp.net mvc-identity初步学习
Install-Package Microsoft.AspNet.Identity.EntityFramework Install-Package Microsoft.AspNet.Identity. ...
- quartz详解1:初步了解quartz
http://blog.itpub.NET/11627468/viewspace-1763389/ 一.引入 你曾经需要应用执行一个任务吗?这个任务每天或每周星期二晚上11:30,或许仅仅每个月的最后 ...
- Asp.Net Core 中利用QuartzHostedService 实现 Quartz 注入依赖 (DI)
QuartzHostedService 是一个用来在Asp.Net Core 中实现 Quartz 的任务注入依赖的nuget 包: 基本示例如下: using System; using Syst ...
- ASP.NET Core使用Quartz定时调度
在应用程序开发过程中,经常会需要定时任务调度功能,本篇博客介绍Asp.net Core如何使用Quartz完成定时调度 一.Quartz使用步骤 创建调度器scheduler,并开启 创建Job作业 ...
随机推荐
- 精尽Spring Boot源码分析 - 支持外部 Tomcat 容器的实现
该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...
- docker部署的nginx非80端口无法访问
请检查nginx容器是否只开启了80端口映射!!! 请检查nginx容器是否只开启了80端口映射!!! 请检查nginx容器是否只开启了80端口映射!!! 如果你访问的端口在nignx容器已经开启了端 ...
- JavaWeb入门知识梳理
万维网 Web App(Web应用程序)是一种可以通过万维网访问的应用程序,用户只需要连接互联网和计算机安装浏览器,即可通过URI在线使用某个Web App,而不需要再安装客户端到计算机上.Web A ...
- Docker:虚拟机挂起后,再启动docker容器连接失败
问题描述 当我们使用VMware15 Pro 创建虚拟机并运行Linux搭建的Docker时,挂起虚拟机后再次运行发现访问Docker容器失败. 解决方式 我们正常的挂起其实是:挂起客户机,博主尝试 ...
- Hystrix 使用说明
1.什么情况下会触发 fallback 方法 名字 描述 触发fallback EMIT 值传递 NO SUCCESS 执行完成,没有错误 NO FAILURE 执行抛出异常 YES TIMEOUT ...
- XCTF reverse_box(idapython)
ida先静态分析,发现有很多a2[1]不知道是什么,就远程动调了一下,发现是我们所输入的字符串,也就是我们所输入的字符串作为索引,通过v4这个数组输出,这题题目的数据漏给了,当时也是一头雾水,后面找了 ...
- WPF技巧:命中测试在视觉树中的使用
我们有时候又需求从当前视觉树中找一些东西,比如鼠标按下的时候,看看鼠标下的元素都有什么.又比如某块区域下有哪些元素?某个坐标点下有哪些元素? 这些需求在使用 命中测试的时候,可以非常方便和快速的去找到 ...
- Kotlin Coroutine(协程): 三、了解协程
@ 目录 前言 一.协程上下文 1.调度器 2.给协程起名 3.局部变量 二.启动模式 CoroutineStart 三.异常处理 1.异常测试 2.CoroutineExceptionHandler ...
- SpringBoot缓存管理(三) 自定义Redis缓存序列化机制
前言 在上一篇文章中,我们完成了SpringBoot整合Redis进行数据缓存管理的工作,但缓存管理的实体类数据使用的是JDK序列化方式(如下图所示),不便于使用可视化管理工具进行查看和管理. 接下来 ...
- C语言:最大公约数和最小公倍数
#include <stdio.h> int main() { int a,b,c,m,t; printf("请输入两个数:\n"); scanf("%d%d ...