以前都是将所有的内容放在一篇文章里,就会导致文章很长,对于学习的人来说,有时候这也是一个障碍。所以,以后我的写作习惯,我就会把我写的文章缩短,但是内容不会少,内容更集中。这样,学习起来也不会很累,很容易看完,也能记得住,不用记得那么多不相关的东西,学习效率也会越高。好了,开始今天的学习计划吧,今天我们要介绍的对象就是 CronTrigger。

一、CronTrigger 对象概述

如果您需要一个基于类似日历的概念而不是基于SimpleTrigger的指定确切间隔来重复的触发执行作业计划,那么CronTrigger通常比SimpleTrigger更有用。
        
        使用CronTrigger,您可以指定诸如“每个星期五中午”或“每个工作日早上9:30”,甚至“每个星期一、星期三和星期五上午9:00至10:00之间的每5分钟”的触发时间表。
        即便如此,像SimpleTrigger一样,CronTrigger也有一个startTime属性,用于指定计划何时生效,以及一个(可选的)endTime属性,用于指定何时停止计划。

 二、Cron表达式

Cron-Expressions用于配置CronTrigger的实例。 Cron-Expressions是实际上由七个子表达式组成的字符串,用于描述计划的各个细节。 这些子表达式用空格分隔,表示:

1.Seconds

        1.Minutes

                1.Hours

                1.Day-of-Month

                1.Month

                1.Day-of-Week

                1.Year (optional field)

完整的cron表达式的一个例子是字符串“0 0 12? * WED“ - 表示”每周三中午12点“。

单个子表达式可以包含范围和/或列表。例如,前一个示例(读作“WED”)中的星期日字段可以用“MON-FRI”、“MON,WED,FRI”甚至“MON-WED,SAT”替换。

通配符(''字符)可用于表示该字段的“每个”可能值。 因此,前一个例子的“月”字段中的''字符仅表示“每个月”。 周日字段中的'*'显然意味着“一周中的每一天”。

所有字段都有一组可以指定的有效值。这些值应该是相当明显的,比如数字0到59表示秒和分钟,数值0到23表示小时。每月的日期可以是0-31的任何值,但您需要注意一个月内的天数!月份可以指定为0到11之间的值,或者使用字符串JAN、FEB、MAR、APR、MAY、JUN、JUL、AUG、SEP、OCT、NOV和DEC。星期几可以指定为1到7之间的值(1 =星期日)或使用字符串SUN,MON,TUE,WED,THU,FRI和SAT。

'/'字符可用于指定值的增量。 例如,如果在“分钟”字段中输入“0/15”,则表示“每隔15分钟,从零分钟开始”。 如果您在“分钟”字段中使用“3/20”,则表示“每小时每20分钟一次,从第3分钟开始” - 或者换句话说,它与在“分钟”中指定“3,23,43”相同。

“?”字符允许用于日期和星期字段。 它用于指定“无特定值”。 当您需要在两个字段之一中指定某些内容而不是另一个字段时,这非常有用。 请参阅下面的示例(和CronTrigger API文档)以获得说明。

“L”字符允许用于日期和星期字段。 这个字符是“last”的简写,但它在两个字段的中具有不同的含义。 例如,日期字段中的“L”值表示“月份的最后一天” -  1月31日,非闰年2月28日。 如果在星期字段中单独使用,则仅表示“7”或“SAT”。如果在星期字段中在另一个值后使用了“L”,则表示“该月的最后一个xxx日” - 例如“6L”或“FRIL”均表示“该月的最后一个星期五”。 使用“L”选项时,重要的是不要指定列表或值范围,因为您得到的结果并不是你想要的。

'W'用于指定最接近给定日期的工作日(周一至周五)。 例如,如果您指定“15W”作为日期字段的值,则含义为:“最接近的工作日到该月的15日”。

‘#’这个词是用来指定这个月的“第n个”XXX工作日。例如,星期几字段中的“6#3”或“FRI#3”的值表示“本月的第三个星期五”。

三、示例 Cron 表达式

以下是表达式及其含义的更多示例 - 您可以在CronTrigger的API文档中找到更多

CronTrigger示例1  - 用于创建触发器的表达式,该触发器每5分钟触发一次

"0 0/5 * * * ?"

CronTrigger示例2  - 用于创建触发器的表达式,该触发器在每分钟10秒后(即上午10:00:10,上午10:05:10等)每5分钟触发一次。

"10 0/5 * * * ?"

CronTrigger示例3  - 用于创建触发器的表达式,该触发器在每周三和周五的10:30,11:30,12:30和13:30触发。

"0 30 10-13 ? * WED,FRI"

CronTrigger示例4  - 用于创建触发器的表达式,该触发器在每个月的5日和20日上午8点到上午10点之间每半小时触发一次。 请注意,触发器不会在上午10:00,即8:00,8:30,9:00和9:30触发

"0 0/30 8-9 5,20 * ?"

请注意,某些计划要求过于复杂,无法通过单个触发器表达 - 例如“上午9:00至上午10:00之间每隔5分钟,下午1:00至晚上10:00之间每20分钟”。 此方案中的解决方案是创建两个触发器,并注册它们以运行相同的作业。

四、建立CronTriggers

CronTrigger实例是使用TriggerBuilder(用于触发器的主要属性)和WithCronSchedule扩展方法(用于特定于CronTrigger的属性)构建的。

您还可以使用CronScheduleBuilder的静态方法来创建计划。

建立一个触发器,每天上午8点到下午5点之间每隔一分钟触发一次:

             trigger = TriggerBuilder.Create()
.WithIdentity("trigger3", "group1")
.WithCronSchedule("0 0/2 8-17 * * ?")
.ForJob("myJob", "group1")
.Build();

构建一个触发器,每天上午10:42触发:

             // we use CronScheduleBuilder's static helper methods here
trigger = TriggerBuilder.Create()
.WithIdentity("trigger3", "group1")
.WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(, ))
.ForJob(myJobKey)
.Build(); 或者 trigger = TriggerBuilder.Create()
.WithIdentity("trigger3", "group1")
.WithCronSchedule("0 42 10 * * ?")
.ForJob("myJob", "group1")
.Build();

构建一个触发器,该触发器将在星期三上午10点42分在TimeZone中触发,而不是系统的默认值:

             trigger = TriggerBuilder.Create()
.WithIdentity("trigger3", "group1")
.WithSchedule(CronScheduleBuilder
.WeeklyOnDayAndHourAndMinute(DayOfWeek.Wednesday, , )
.InTimeZone(TimeZoneInfo.FindSystemTimeZoneById("Central America Standard Time")))
.ForJob(myJobKey)
.Build(); 或者 trigger = TriggerBuilder.Create()
.WithIdentity("trigger3", "group1")
.WithCronSchedule("0 42 10 ? * WED", x => x
.InTimeZone(TimeZoneInfo.FindSystemTimeZoneById("Central America Standard Time")))
.ForJob(myJobKey)
.Build();

五、CronTrigger Misfire 说明

以下说明可用于告知Quartz当CronTrigger发生失效时它应该做什么。 (在本教程的“更多关于触发器”部分中介绍了失效情况)。 这些指令以常量定义(并且API文档具有对其行为的描述)。 说明包括:

MisfireInstruction.IgnoreMisfirePolicy

MisfireInstruction.CronTrigger.DoNothing

MisfireInstruction.CronTrigger.FireOnceNow

所有触发器都可以使用MisfireInstrution.SmartPolicy指令,该指令也是所有触发器类型的默认指令。 CronTrigger将“smart policy”指令解释为MisfireInstruction.CronTrigger.FireOnceNow。 CronTrigger.UpdateAfterMisfire()方法的API文档解释了此行为的确切详细信息。

在构建CronTriggers时,您将失效指令指定为cron调度的一部分(通过WithCronSchedule扩展方法):

             trigger = TriggerBuilder.Create()
.WithIdentity("trigger3", "group1")
.WithCronSchedule("0 0/2 8-17 * * ?", x => x
.WithMisfireHandlingInstructionFireAndProceed())
.ForJob("myJob", "group1")
.Build();

 六、总结

  今天要写的内容差不多了,由于个人的翻译水平有限,可能存在不正确的地方,为了让大家可以看到原文,这样可以有个更好的理解,我也把原地址贴出来。原文地址如下:https://www.quartz-scheduler.net/documentation/quartz-3.x/tutorial/crontriggers.html

不忘初心,继续努力。

Quartz.Net进阶之四:CronTrigger 详述的更多相关文章

  1. Quartz.Net进阶之六:详述 JobStores

    一.介绍 今天开始学习 JobStore,别的先不说,也不用翻译软件来翻译,直接从字面意思看来理解一下.我第一眼的感觉就是 job 是任务的意思,Store 是商店的意思,连起来就是可以存储 Job ...

  2. Quartz.Net进阶之三:SimpleTrigger详述

    以前都是将所有的内容放在一篇文章里,就会导致文章很长,对于学习的人来说,有时候这也是一个障碍.所以,以后我的写作习惯,我就会把我写的文章缩短,但是内容不会少,内容更集中.这样,学习起来也不会很累,很容 ...

  3. Quartz.Net进阶之一:初识Job作业和触发器

        前几天写了一篇有关Quartz.Net入门的文章,大家感觉不过瘾,想让我在写一些比较深入的文章.其实这个东西,我也是刚入门,我也想继续深入了解一下,所以就努力看了一些资料,然后自己再整理和翻译 ...

  4. Net作业调度(三) — Quartz.Net进阶

    介绍 前面介绍Quartz.Net的基本用法,但在实际应用中,往往有更多的特性需求,比如记录job执行的执行历史,发邮件等. 阅读目录 Quartz.Net插件 TriggerListener,Job ...

  5. Quartz.net 定时调度CronTrigger时间配置格式说明

    1.   CronTrigger时间格式配置说明 CronTrigger配置格式: 格式: [秒] [分] [小时] [日] [月] [周] [年] 序号 说明 是否必填 允许填写的值 允许的通配符 ...

  6. Quartz 2.2.x CronTrigger Tutorial

    http://www.quartz-scheduler.org/documentation/quartz-2.2.x/tutorials/crontrigger.html Introduction c ...

  7. Quartz 第六课 CronTrigger(官方文档翻译)

    CronTriggers使用的频率比SimpleTrigger跟高.如果需要schedule 中触发Job的方式类似于日历的形式而不是一个确定的是时间间隔,那就需要使用CronTrigger. 对于C ...

  8. Quartz.Net进阶之七:QuartzNet其他的功能简述

    一.介绍 今天是这个系列的最后一篇文章了,主要功能说的差不多了,我们来看看其他相关的内容.话说回来,虽然是这个系列的最后一篇文章,并不代表Quartz的东西就这么点,学习阶段,就这些了,如果以后有了使 ...

  9. Quartz.Net进阶之五:TriggerListener 、JobListener 和 SchedulerListener

    一.介绍 今天开始学习监听器,就是 Listener,在Quartz.Net 中,主要包含3类的监听器,主要内容包括:TriggerListener .JobListener 和 SchedulerL ...

随机推荐

  1. Linux 文件查看,文件夹切换,权限查看

    当前用户只操作当前用户目录 1. 输入终端显示内容: 用户 @ 系统 : 路径信息  $ $ 表示普通用户  家目录 # 表示超级用户  家目录 [sudo -i ]  使用root用户 :   使用 ...

  2. shell(3)拼写检查与词典操作

    1:Linux下,在/usr/share/dict下包含了词典文件,检查一个单词是否在词典里: #!/bin/bash #文件名:checkout.sh #检查给定的单词是否为词典中的单词 word= ...

  3. docker centos7创建consul镜像以及用docker-compose启动镜像

    直接贴代码了: Dockfile: # Version 0.1 FROM kuba_centos7 MAINTAINER kuba si812cn@163.com # This is the rele ...

  4. 前段开发神奇webstorm安装注册和汉化

    软件下载地址: http://www.jetbrains.com/webstorm/ 安装完后退出. 重新打开,进行激活 这里我们选择“license server”然后输入:http://idea. ...

  5. Node.js express获取参数有三种方法

    express获取参数有三种方法:官网介绍如下 Checks route params (req.params), ex: /user/:id Checks query string params ( ...

  6. SAX解析与DOM解析

    SAX解析实例:http://www.iteye.com/topic/763895 Java Sax解析是按照xml文件的顺序一步一步的来解析,在解析xml文件之前,我们要先了解xml文件的节点的种类 ...

  7. 1131(★、※)Subway Map

    思路:DFS遍历 #include <iostream> #include <map> #include <vector> #include <cstdio& ...

  8. PAT 甲级 1041 Be Unique (20 分)

    1041 Be Unique (20 分) Being unique is so important to people on Mars that even their lottery is desi ...

  9. word embeddding和keras中的embedding

    训练好的词向量模型被保存下来,该模型的本质就是一个m*n的矩阵,m代表训练语料中词的个数,n代表训练时我们设定的词向量维度.当我们训练好模型后再次调用时,就可以从该模型中直接获取到对应词的词向量. 通 ...

  10. 使用Python内置浏览器缓存cookies并做更新

    import requests #python内置的微型浏览器,没有界面的 #作用:缓存cookies s = requests.session() print(s.headers) #伪造请求头部, ...