欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Quartz.Net学习笔记

程序员文章站 2022-09-30 20:48:28
Quartz.NET是一个强大、开源、轻量的作业调度框架,是 OpenSymphony 的 Quartz API 的.NET移植,用C#改写,可用于winform和asp.net应用中。它灵活而不复杂。你能够用它来为执行一个作业而创建简单的或复杂的作业调度。它有很多特征,如:数据库支持,集群,插件,... ......

一、概述

  quartz.net是一个强大、开源、轻量的作业调度框架,是 opensymphony 的 quartz api 的.net移植,用c#改写,可用于winform和asp.net应用中。它灵活而不复杂。你能够用它来为执行一个作业而创建简单的或复杂的作业调度。它有很多特征,如:数据库支持,集群,插件,支持cron-like表达式等等。

  通俗说它的功能是:比如说我想每天晚上2点让程序或网站执行某些代码,或者每隔5秒种我想查看是否有新的任务要处理等。

官网:

源码:

示例:

  其实quartz是一个完全由java编写的开源作业调度框架,quartz是opensymphony开源组织在job scheduling领域又一个开源项目,它可以与j2ee与j2se应用程序相结合也可以单独使用。quartz可以用来创建简单或为运行十个,百个,甚至是好几万个jobs这样复杂的程序。而quartz.net与npoi一样是一个donet平台下的对应版本。如果您使用java直接访问这里就好了

二、依赖框架

  引入框架的方法非常简单你可以直接用nuget管理包,也可以在项目中添加引用,这里主要介绍前者。

2.1 安装nuget

  新版本的visual studio默认情况是安装了nuget的,如visual studio2015,但如果没有安装,打开vs菜单“工具”->"扩展与更新"

Quartz.Net学习笔记 

  在扩展与更新中搜索“nuget”,可以新安装或卸载后升级:

Quartz.Net学习笔记

2.2 修改nuget镜像

  为解决国内访问nuget服务器速度不稳定的问题建议你最好选择一些镜像服务器,这样可以加速下载。

  在visual studio中的添加方法是:打开“工具”->“选项”菜单

Quartz.Net学习笔记 

  在左侧菜单中找到“nuget包管理器”

 Quartz.Net学习笔记

  点击右上角的加号,添加两个镜像,这些地址可以上网搜索,我使用的是如下两个:

设置一下顺序就ok了。

2.3 使用nuget安装quartz.net

  点击“工具”->"nuget包管理器"->“程序包管理器控制台”

 Quartz.Net学习笔记

输入安装包的命令:

install-package quartz

安装结果如下:

Quartz.Net学习笔记

  此时包管理器中就下载了需要的程序集与相关文件,程序中也添加了引用。

Quartz.Net学习笔记

三、框架应用

3.1 定义要执行的任务

  定义一个类,实现quartz.ijob接口,实现方法execute,timejob.cs文件的代码如下:

Quartz.Net学习笔记
 1 using system;
 2 using system.threading.tasks;
 3 using quartz;
 4 using system.io;
 5  
 6 namespace quartzdonetdemo
 7 {
 8     /// <summary>
 9     /// 文件记时任务
10     /// </summary>
11     public class timejob : ijob
12     {
13         /// <summary>
14         /// 文件记时任务
15         /// </summary>
16         /// <param name="context"></param>
17         /// <returns></returns>
18         task ijob.execute(ijobexecutioncontext context)
19         {
20 
21             //方式一
22             //environment:提供有关当前环境和平台的信息以及操作它们的方法
23             //file.appendalltext(@"d:\quartz.txt", datetime.now + environment.newline);
24             //return task.run(() => console.writeline(datetime.now));
25 
26             //方式二
27             file.appendalltext(@"d:\quartz.txt", datetime.now + environment.newline);
28             console.writeline(datetime.now);
29             return task.fromresult(true);
30         }
31     }
32 }
view code

3.2 创建一个调度器

  调度器负责管理与控制任务的执行:

1 //创建调度器工厂
2 ischedulerfactory factory = new stdschedulerfactory();
3 
4 //创建调度器
5 ischeduler scheduler = await factory.getscheduler();

3.3 创建一个任务对象

  这个任务对象就是我们将要执行的工作,job1是名称,group1是组名。

ijobdetail job = jobbuilder.create<timejob>().withidentity("myjob1", "group1").build();

3.4 创建一个触发器

  触发器定义了什么时间任务开始或每隔多久执行一次.

1 //创建一个触发器:withsimpleschedule(a => a.withintervalinseconds(10).repeatforever())
2 itrigger trigger = triggerbuilder.create().withidentity("mytrigger1", "group1").startnow().withcronschedule("0/10 * * * * ?").build();

3.5 将任务与触发器添加到调度器中并执行

1 //将任务和触发器添加到调度器里
2 await scheduler.schedulejob(job, trigger);
3 
4 //开始执行
5 await scheduler.start();

3.6 quartz的cron表达式

  cron表达式就是用于设定时间的一个字符串,在前面的代码中我们就用到了,如下所示:

1 //创建一个触发器
2 itrigger trigger = triggerbuilder.create()
3 .withidentity("mytrigger1", "group1")
4 .startnow()
5 .withcronschedule("0/10 * * * * ?") //每10秒执行一次
6 .build();

  官方英文介绍:

  cron expressions 整体上还是非常容易理解的,只有一点需要注意:"?"号的用法,看下文可以知道“?”可以用在 day of month 和 day of week中,他主要是为了解决如下场景,如:每月的1号的每小时的31分钟,正确的表达式是:* 31 * 1 * ?,而不能是:* 31 * 1 * *,因为这样代表每周的任意一天。

/*
由7段构成:秒 分 时 日 月 星期 年(可选)
"-" :表示范围  mon-wed表示星期一到星期三
"," :表示列举 mon,web表示星期一和星期三
"*" :表是“每”,每月,每天,每周,每年等
"/" :表示增量:0/15(处于分钟段里面) 每15分钟,在0分以后开始,3/20 每20分钟,从3分钟以后开始
"?" :只能出现在日,星期段里面,表示不指定具体的值
"l" :只能出现在日,星期段里面,是last的缩写,一个月的最后一天,一个星期的最后一天(星期六)
"w" :表示工作日,距离给定值最近的工作日
"#" :表示一个月的第几个星期几,例如:"6#3"表示每个月的第三个星期五(1=sun...6=fri,7=sat)
如果minutes的数值是 '0/15' ,表示从0开始每15分钟执行
如果minutes的数值是 '3/20' ,表示从3开始每20分钟执行,也就是‘3/23/43’
*/

  官方示例:

表达式

解释

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 * ?

每个月的第二天到最后一天的上午10:15触发

0 15 10 ? * 6l

每月的最后一个星期五上午10:15触发

0 15 10 ? * 6l

每个月最后一个星期五上午10时15分触发

0 15 10 ? * 6l 2002-2005

2002年至2005年的每月的最后一个星期五上午10:15触发

0 15 10 ? * 6#3

每月的第三个星期五上午10:15触发

0 0 12 1/5 * ?

每月每隔5天下午12点(中午)触发, 从每月的第一天开始

0 11 11 11 11 ?

每11月11日上午11时11分触发

Quartz.Net学习笔记

参考资料:

quartz.net实现作业调度

quartz.net 作业调度使用