一、概述

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

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

官网:http://www.quartz-scheduler.net/

源码:https://github.com/quartznet/quartznet

示例:http://www.quartz-scheduler.net/documentation/quartz-2.x/quick-start.html

  其实Quartz是一个完全由java编写的开源作业调度框架,Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。而Quartz.Net与NPOI一样是一个DoNet平台下的对应版本。如果您使用Java直接访问这里就好了http://www.quartz-scheduler.org/

二、依赖框架

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

2.1 安装Nuget

  新版本的Visual Studio默认情况是安装了Nuget的,如Visual Studio2015,但如果没有安装,打开VS菜单“工具”->"扩展与更新"

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

2.2 修改Nuget镜像

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

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

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

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

https://nuget.cnblogs.com/v3/index.json

http://api.nuget.org/v3/index.json

设置一下顺序就OK了。

2.3 使用nuget安装Quartz.NET

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

输入安装包的命令:

Install-Package Quartz

安装结果如下:

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

三、框架应用

3.1 定义要执行的任务

  定义一个类,实现Quartz.IJob接口,实现方法Execute,TimeJob.cs文件的代码如下:

 using System;
using System.Threading.Tasks;
using Quartz;
using System.IO; namespace QuartzDoNetDemo
{
/// <summary>
/// 文件记时任务
/// </summary>
public class TimeJob : IJob
{
/// <summary>
/// 文件记时任务
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
Task IJob.Execute(IJobExecutionContext context)
{ //方式一
//Environment:提供有关当前环境和平台的信息以及操作它们的方法
//File.AppendAllText(@"d:\Quartz.txt", DateTime.Now + Environment.NewLine);
//return Task.Run(() => Console.WriteLine(DateTime.Now)); //方式二
File.AppendAllText(@"d:\Quartz.txt", DateTime.Now + Environment.NewLine);
Console.WriteLine(DateTime.Now);
return Task.FromResult(true);
}
}
}

3.2 创建一个调度器

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

 //创建调度器工厂
ISchedulerFactory factory = new StdSchedulerFactory(); //创建调度器
IScheduler scheduler = await factory.GetScheduler();

3.3 创建一个任务对象

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

IJobDetail job = JobBuilder.Create<TimeJob>().WithIdentity("myJob1", "group1").Build();

3.4 创建一个触发器

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

 //创建一个触发器:WithSimpleSchedule(a => a.WithIntervalInSeconds(10).RepeatForever())
ITrigger trigger = TriggerBuilder.Create().WithIdentity("myTrigger1", "group1").StartNow().WithCronSchedule("0/10 * * * * ?").Build();

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

 //将任务和触发器添加到调度器里
await scheduler.ScheduleJob(job, trigger); //开始执行
await scheduler.Start();

3.6 Quartz的cron表达式

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

 //创建一个触发器
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("myTrigger1", "group1")
.StartNow()
.WithCronSchedule("0/10 * * * * ?") //每10秒执行一次
.Build();

  官方英文介绍:http://www.quartz-scheduler.net/documentation/quartz-2.x/tutorial/crontrigger.html

  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学习笔记的更多相关文章

  1. Quartz.NET学习笔记(二) Job和JobDetails

    Job和JobDetails的关系 接一篇的例子 ISchedulerFactory schedFact = new StdSchedulerFactory(); IScheduler sched = ...

  2. Quartz.NET学习笔记(三) 简单触发器

    触发器是Quartz.NET的另外第一个核心元素,他有2种类型,简单触发器(Simple Trigger)和计划任务触发器(Cron  Trigger), 一个触发器可以绑定一个任务. 通用触发器属性 ...

  3. Quartz.NET学习笔记(一) 简介

    Quartz.NET是一款开源的任务调度框架,他是由Java中的任务调度框架Quartz移植而来的.官方网站https://www.quartz-scheduler.net/. Quartz.Net的 ...

  4. Quartz.Net学习笔记(2)-简介

    一.Quartz.Net是什么 1.来源 Quartz.Net是一个开源的作业调度框架: 2.下载地址 官网地址:http://www.quartz-scheduler.net/documentati ...

  5. Quartz.Net学习笔记(1)-完整的例子

    一.开发环境 系统:Win10 编译器:VS2013 .Net版本:4.5 Quartz版本:2.3.3 二.涉及程序集 Common.Logging.Core.dll Common.Logging. ...

  6. Quartz.NET学习笔记(四) 计划任务触发器

    通常来说计划任务触发器会比简单触发器的使用频率高很多.如果你的任务是需要基于日历每天定时运行,那你就应该使用计划任务触发器,例如每周五中午12:00执行任务,或者每天早上9点执行任务. 计划任务表达式 ...

  7. Quartz学习笔记:集群部署&高可用

    Quartz学习笔记:集群部署&高可用 集群部署 一个Quartz集群中的每个节点是一个独立的Quartz应用,它又管理着其他的节点.这就意味着你必须对每个节点分别启动或停止.Quartz集群 ...

  8. Quartz学习笔记:基础知识

    Quartz学习笔记:基础知识 引入Quartz 关于任务调度 关于任务调度,Java.util.Timer是最简单的一种实现任务调度的方法,简单的使用如下: import java.util.Tim ...

  9. 【转】Spring.NET学习笔记——目录

    目录 前言 Spring.NET学习笔记——前言 第一阶段:控制反转与依赖注入IoC&DI Spring.NET学习笔记1——控制反转(基础篇) Level 200 Spring.NET学习笔 ...

随机推荐

  1. 关于overflow的问题

    <head> <title></title> <style type="text/css"> body { margin: 0; p ...

  2. SQL Server中表锁定的原理及解锁演示

    有几个朋友留言建议结合例子来演示一下, 上篇已经说过锁的几种类型, 可以利用系统动态视图sys.dm_tran_locks查看到,重要的栏位如下: resource_type 被锁的资源类型(Data ...

  3. 汽车之家店铺商品详情数据抓取 DotnetSpider实战[二]

    一.迟到的下期预告 自从上一篇文章发布到现在,大约差不多有3个月的样子,其实一直想把这个实战入门系列的教程写完,一个是为了支持DotnetSpider,二个是为了.Net 社区发展献出一份绵薄之力,这 ...

  4. linux学习(JDK,Tomcat,nginx)安装

    最近学习了在linux,在上面搭建了一个tomcat的服务器,后来又使用nginx进行反向代理了一下下,希望文章对初学者有所帮助. 1.安装JDK.(采用jdk的rpm包进行安装) 安装jdk之前需要 ...

  5. Mysql中MyISAM引擎和InnoDB引擎的比较

    结论 如果不清楚自己应该用什么引擎,那么请选择InnoDB,Mysql5.5+的版本默认引擎都是InnoDB,早期的Mysql版本默认的引擎是MyISAM MyISAM 和 InnoDB的适用场景 M ...

  6. Spring Boot 2.0 教程 - 配置详解

    Spring Boot 可以通过properties文件,YAML文件,环境变量和命令行参数进行配置.属性值可以通过,@Value注解,Environment或者ConfigurationProper ...

  7. AJAX from S3 CORS fails on preflight OPTIONS with 403

    解决办法: 将 <!-- Sample policy --> <CORSConfiguration> <CORSRule> <AllowedOrigin> ...

  8. CSDN Android客户端的制作 导航帖

    弄个导航贴,把相关知识来个汇总. CSDN Android的客户端的效果图: 分别通过以下博客进行详细的讲解: 1.Android 使用Fragment,ViewPagerIndicator 制作cs ...

  9. Dreamweaver无法启动:xml parsing fatal error..Designer.xml错误解决方法

    xml parsing fatal error:Invalid document structure,line:1,file:C:\Documents and Settings\Administrat ...

  10. Hibernate Annotation 生成数据库表(UUId)

    User.java实体类 package com.tao.pojo; import javax.persistence.Column; //用注解的方式生成表 import javax.persist ...