zoukankan      html  css  js  c++  java
  • Quartz.Net学习笔记

    一、概述

      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文件的代码如下:

     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();

      官方英文介绍: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 作业调度使用

  • 相关阅读:
    bzoj 1031: [JSOI2007]字符加密Cipher
    [BZOJ5011][JXOI2017]颜色
    [BZOJ4765]普通计算姬(分块+树状数组)
    [BZOJ3261]最大异或和(可持久化Trie)
    [BZOJ4861][BJOI2017]魔法咒语(AC自动机+矩阵优化DP)
    [BZOJ2286][SDOI2011]消耗战(虚树DP)
    [BZOJ2109][NOI2010]航空管制(贪心+拓扑)
    [BZOJ1305][CQOI2009]跳舞(网络流)
    [Nescafé41]编码病毒(循环卷积)
    [Nescafé41]异化多肽(多项式求逆元)
  • 原文地址:https://www.cnblogs.com/yscit/p/10393867.html
Copyright © 2011-2022 走看看