Quartz.NET - 课程 6: Cron 触发器
译者注:
目录在这 Quartz.NET 3.x 教程
原文在这 Lesson 6: CronTrigger
如果你需要一个类似日历概念而不是像 SimpleTrigger 那样指定间隔来调度作业触发, 那么 CronTrigger 通常比 SimpleTrigger 更有用.
使用 CronTrigger, 你可以指定调度触发时间, 比如 "每周五的中午", "每周日的上午9:30", 甚至是 "每周一, 周三, 周五的上午9:00到10:00之间每5分钟执行一次".
既然如此, 像 SimpleTrigger 一样, CronTrigger 也有一个开始时间来指定调度何时生效, 还有一个 (可选) 结束时间来指定调度应该何时终止.
Cron 表达式
Cron 表达式用于配置 CronTrigger 的实例. Cron 表达式实际上是由七个子表达式组成的字符串, 她们描述了调度的各个细节. 这些子表达式用空格分隔,从左往右依次表示:
- 秒
- 分钟
- 时
- 日
- 月
- 星期几
- 年 (可选字段)
一个完整的 cron 表达式的例子是字符串 "0 0 12 ? * WED" - 意思是 "每周三下午12:00".
单个子表达式可以包含范围和/或列表. 例如, 上一个示例中的周数字段(读作 "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分钟, 从0分钟开始". 如果你在 "分钟" 字段中使用 "3/20", 则表示 "一小时内每20分钟, 从第3分钟开始", - 亦或在分钟字段中指定 "3,23,43" 效果一样.
问号字符 '?' 可用于 "日期" 和 "星期几" 字段. 她用于表示 "无特定值". 当你需要在两个字段中的一个字段中指定某些内容, 而不在另一个字段中指定时, 这非常有用. 请参阅下面的示例 (和 CronTrigger API文档) 来获得说明.
字符 'L' 可用于 "日期" 和 "星期几" 字段. 这个字符是 "last" 的简写, 但在两个字段中的有不同的含义. 举个栗子, "日期" 字段中的值 "L" 表示 "月份的最后一天" - 1月31日, 非闰年的2月28日. 如果在 "星期几" 字段中单独使用, 她只表示 "7" 或 "SAT". 但如果在星期几字段中用在另一个值之后, 则表示 "月的最后一个 xxx 天", 例如 "6L" 或 "FRIL" 都表示 "月份的最后一个星期五". 当使用 "L" 选项时, 千万不要指定列表或值的范围, 因为这样会得到让你百撕不得骑姐的结果.
字母 'W' 用来指定离给定日期最近的工作日 (星期一 - 星期五). 举个栗子, 如果你指定 "15W" 作为 "日期" 字段的值, 则其含义是: "最接近月15日的工作日".
井号 '#' 用于指定每月的 "第n个" XXX工作日. 例如, 星期几字段中的值 "6#3" 或 "FRI#3" 表示 "每月的第三个星期五".
Cron 表达式的一些栗子
下面是一些表达式及其含义的更多示例 - 你可以在 CronTrigger 的API文档中找到更多
CronTrigger 举个栗子 1 - 一个用来创建触发器的表达式, 简单的每5分钟触发一次.
"0 0/5 * * * ?"
CronTrigger 举个栗子 2 - 一个用来创建触发器的表达式, 每5分钟10秒触发一次 (如上午 10:00:10, 上午 10:05:10, 等).
"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分钟一次". 这种需求场景的解决办法是简单的创建2个触发器, 并注册她们来运行同一个作业.
构建 CronTriggers
CronTrigger 实例是使用 TriggerBuilder (用于触发器的主属性) 和 WithCronSchedule 扩展方法 (用于 CronTrigger 的特定属性) 来构建的.
你还可以使用 CronScheduleBuilder 的静态方法来构建调度.
构建一个触发器其在每天上午8点到下午8点的每一分钟会触发一次:
trigger = TriggerBuilder.Create()
.WithIdentity("trigger3", "group1")
.WithCronSchedule("0 0/2 8-17 * * ?")
.ForJob("myJob", "group1")
.Build();
构建一个触发器其会在每天上午 10:42 触发一次:
// 这里我们使用 CronScheduleBuilder 的静态助手方法
trigger = TriggerBuilder.Create()
.WithIdentity("trigger3", "group1")
.WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(10, 42))
.ForJob(myJobKey)
.Build();
或者 -
trigger = TriggerBuilder.Create()
.WithIdentity("trigger3", "group1")
.WithCronSchedule("0 42 10 * * ?")
.ForJob("myJob", "group1")
.Build();
构建一个触发器其会在除系统的默认时区以外的周三上午 10:42 触发:
trigger = TriggerBuilder.Create()
.WithIdentity("trigger3", "group1")
.WithSchedule(CronScheduleBuilder
.WeeklyOnDayAndHourAndMinute(DayOfWeek.Wednesday, 10, 42)
.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 哑火指令
以下指令可用于通知 Quartz 在 CronTrigger 发生哑火时应采取的措施. (本教程的 "更多关于触发器" 部分介绍了哑火指令). 这些指令被定义为常量 (API文档对其行为有描述). 指令包括:
- MisfireInstruction.IgnoreMisfirePolicy
- MisfireInstruction.CronTrigger.DoNothing
- MisfireInstruction.CronTrigger.FireOnceNow
所有触发器都可以使用 Misfireinstruction.SmartPolicy 指令, 并且此指令也是所有触发器类型的默认指令. CronTrigger 将 MisfireInstruction.CronTrigger.FireOnceNow 作为 '智能策略' 指令. CronTrigger.UpdateAfterMisfire() 方法的API文档解释了此行为的确切细节.
当构建 ConTrigger 时, 你可以指定哑火指令作为 cron 调度的一部分 (通过 WithCronSchedule 扩展方法):
trigger = TriggerBuilder.Create()
.WithIdentity("trigger3", "group1")
.WithCronSchedule("0 0/2 8-17 * * ?", x => x
.WithMisfireHandlingInstructionFireAndProceed())
.ForJob("myJob", "group1")
.Build();
Quartz.NET - 课程 6: Cron 触发器的更多相关文章
- Quartz Cron 触发器 Cron Expression 的格式
转自:http://blog.csdn.net/yefengmeander/article/details/5985064 上一文中提到 Cron触发器可以接受一个表达式来指定执行JOB,下面看看这个 ...
- Quartz.net 定时任务之Cron表达式
一.cron表达式简单介绍和下载 1.在上一篇博客"Quartz.net 定时任务之简单任务"中,我简单介绍了quartz的使用,而这篇博客我将介绍cron的具体使用(不足之处望大 ...
- 做了一个quartz用到的cron在线生成器
做了一个quartz用到的cron在线生成器 做了一个quartz用到的cron在线生成器 做这个的目的是前期在做Quartz时老是不知道如何去写,我想也有很多人和我一样吧. 有一次使用了一个老外 ...
- Quartz.Net - Lesson2: 任务和触发器
Lesson 2: 任务和触发器 本系列文章是官方3.x文档的翻译,原文地址:https://www.quartz-scheduler.net/documentation/quartz-3.x/tut ...
- Quartz定时任务学习(七)Cron 触发器
Cron表达式 Quartz使用类似于Linux下的Cron表达式定义时间规则,Cron表达式由6或7个由空格分隔的时间字段组成,如表1所示: 位置 时间域名 允许值 允许的特殊字符 1 秒 0-59 ...
- 作业调度框架 Quartz 学习笔记(三) -- Cron表达式 (转载)
前面两篇说的是简单的触发器(SimpleTrigger) , SimpleTrigger 只能处理简单的事件出发,如果想灵活的进行任务的触发,就要请出 CronTrigger 这个重要人物了. Cro ...
- Quartz学习-- quartz基本介绍和 Cron表达式
Quartz学习 一. Quartz 大致简介 Quartz 是完全由 java 开发的一个开源的任务日程管理系统 任务日程管理系统 换句话说就是: 一个预先确定的日程时间到达时,负责执行任务的 ...
- Quartz(自动任务)中的触发器Trigger
1.Quartz中的触发器TriggerJob 包含了要执行任务的逻辑,但是 Job 对何时该执行却一无所知.这个事情留给了 Trigger.Quartz Trigger 继承了抽象的 org.qua ...
- Quartz.NET - 教程 5: 简单触发器
译者注: 目录在这 Quartz.NET 3.x 教程 原文在这 Lesson 5: SimpleTrigger 如果你需要在特定的时间点执行一次作业, 或者在特定的时间点执行一次作业, 然后在特定的 ...
随机推荐
- 异数OS 2017 DPDK 峰会观后感
1.DPDK in Container 使用虚拟网卡设备技术为每一个容器分配一个IP 网卡适配器(queue).容器技术可以解决虚拟机技术中虚拟机过于臃肿,难于热迁移的问题,可能可以代替美团OVS方案 ...
- BigInteger的权限设计
通过储存菜单权限的一个字段(id自定义也是可以的) 1 将选中菜单树的id转换成字符数组的形式, 进行BigInteger对权限进行2的权的和计算 public static BigInteger s ...
- Oracle GoldenGate for DB2
--Enable logdb2 update db cfg using LOGARCHMETH1 DISK:/home/db2inst1/arclogs--Rebootdb2 terminatedb2 ...
- ubuntu文件操作mkdir cp mv rm ln
pwd:显示当前目录 date:显示当前日期 cal:显示日历 ls:列出目录内容 cd:改变当前工作目录 ‘.’:代表工作目录 ‘..’:代表工作目录父目录 进入当前目录的父目录:cd /home ...
- tensorboard网络结构
一.tensorboard网络结构 import tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_data ...
- 安全性与收尾工作 运用过滤器进行授权 精通ASP-NET-MVC-5-弗瑞曼
- 【阿K学Python系列】一Python基础语法(二)
前言 通过上一章的学习[阿k学Python]一Python入门(一),我们已经初步了解到Python是一种解释型.面向对象.动态数据类型的高级程序设计语言,当然也是一门脚本语言,像前端需要学习的Jav ...
- 2020.2,《The day after tomorrow》
“The day after tomorrow, where will you be?” 2020春节冠状病毒肆虐被迫禁足家里,无意间打开了2004年由德国罗兰·艾默里奇(Roland Emmeric ...
- Kafka系列1:Kafka概况
Kafka系列1:Kafka概况 Kafka是当前分布式系统中最流行的消息中间件之一,凭借着其高吞吐量的设计,在日志收集系统和消息系统的应用场景中深得开发者喜爱.本篇就聊聊Kafka相关的一些知识点. ...
- Shell常用命令之主机检测(ping)
主机检测命令ping 向网络主机发送ICMP回传请求 常用选项 -A:洪水攻击选项,启用此功能能在短时间之内发送大量的ping包 -b:开启ping网桥模式,默认不允许ping网桥 -c:设置发送多少 ...