Quartz.net官方开发指南 第四课:关于Triggers更多内容
同Job一样,trigger非常容易使用,但它有一些可选项需要注意和理解,同时,trigger有不同的类型,要按照需求进行选择。
Calendars——日历
Quartz Calendar对象在trigger被存储到scheduler时与trigger相关联。Calendar对于在trigger触发日程中的采用批量世间非常有用。例如:你想要创建一个在每个工作日上午9:30触发一个触发器,那么就添加一个排除所有节假日的日历。
Calendar可以是任何实现Calendar接口的序列化对象。看起来如下;
using System;
using Quartz.Impl.Calendar;
namespace Quartz
{
/// <summary>
/// An interface to be implemented by objects that define spaces of time during
/// which an associated <see cref="Trigger" /> may fire.
/// </summary>
/// <remarks>
/// Calendars do not define actual fire times, but rather are used to limit a
/// <see cref="Trigger" /> from firing on its normal schedule if necessary. Most
/// Calendars include all times by default and allow the user to specify times to
/// exclude. As such, it is often useful to think of Calendars as being used to
/// <i>exclude</i> a block of time, as opposed to <i>include</i>
/// a block of time. (i.e. the schedule "fire every five minutes except on Sundays" could be
/// implemented with a <see cref="SimpleTrigger" /> and a <see cref="WeeklyCalendar" /> which excludes Sundays)
/// </remarks>
/// <author>James House</author>
/// <author>Juergen Donnerstag</author>
public interface ICalendar
{
/// <summary>
/// Gets or sets a description for the <see cref="ICalendar" /> instance - may be
/// useful for remembering/displaying the purpose of the calendar, though
/// the description has no meaning to Quartz.
/// </summary>
string Description { get; set; }
/// <summary>
/// Set a new base calendar or remove the existing one.
/// Get the base calendar.
/// </summary>
ICalendar CalendarBase { set; get; }
/// <summary>
/// Determine whether the given time is 'included' by the
/// Calendar.
/// </summary>
bool IsTimeIncluded(DateTime time);
/// <summary>
/// Determine the next time that is 'included' by the
/// Calendar after the given time.
/// </summary>
DateTime GetNextIncludedTime(DateTime time);
}
}
注意,这些方法的参数都是DateTime型,你可以猜想出,它们的时间戳是毫秒的格式。这意味日历能够排除毫秒精度的时间。最可能的是,你可能对排除整天的时间感兴趣。为了提供方便,Quartz提供了一个Quartz.Impl.Calendar.HolidayCalendar,这个类可以排除整天的时间。
Calendars必须被实例化,然后通过AddCalendar (..)方法注册到scheduler中。如果使用HolidayCalendar,在实例化之后,你可以使用它的AddExcludedDate (DateTime excludedDate))方法来定义你想要从日程表中排除的时间。同一个calendar实例可以被用于多个trigger中,如下:
Using Calendars
ICalendar cronCalendar = new CronCalendar("0/5 * * * * ?");
ICalendar holidayCalendar = new HolidayCalendar();
sched.AddCalendar("cronCalendar", cronCalendar, true, true);
sched.AddCalendar("holidayCalendar", holidayCalendar, true, true);
JobDetail job = new JobDetail("job_" + count, schedId, typeof (SimpleRecoveryJob));
SimpleTrigger trigger = new SimpleTrigger("trig_" + count, schedId, 20, 5000L);
trigger.AddTriggerListener(new DummyTriggerListener().Name);
trigger.StartTime = DateTime.Now.AddMilliseconds(1000L);
sched.ScheduleJob(job, trigger);
传入SimpleTrigger构造函数的参数的细节将在下章中介绍。但是,任何在日历中被排除的时间所要进行的触发都被取消。
Misfire Instructions——未触发指令
Trigger的另一个重要属性就是它的“misfire instruction(未触发指令)”。如果因为scheduler被关闭而导致持久的触发器“错过”了触发时间,这时,未触发就发生了。不同类型的触发器有不同的未触发指令。缺省情况下,他们会使用一个“智能策略”指令——根据触发器类型和配置的不同产生不同动作。当scheduler开始时,它查找所有未触发的持久triggers,然后按照每个触发器所配置的未触发指令来更新它们。开始工程中使用Quartz的时,应熟悉定义在各个类型触发器上的未触发指令。关于未触发指令信息的详细说明将在每种特定的类型触发器的指南课程中给出。可以通过MisfireInstruction属性来为给定的触发器实例配置未触发指令。
TriggerUtils - Triggers Made Easy(TriggerUtils——使Triggers变得容易)
TriggerUtils类包含了创建触发器以及日期的便捷方法。使用这个类可以轻松地使触发器在每分钟,小时,日,星期,月等触发。使用这个类也可以产生距离触发最近的妙、分或者小时,这对设定触发开始时间非常有用。
TriggerListeners
最后,如同job一样,triggers可以注册监听器,实现TriggerListener接口的对象将可以收到触发器被触发的通知。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python素材下载爬虫,多线程rar下载爬虫
- 一个简单的图片爬虫,Python图片采集下载
- 百度统计后台总是被广告骚扰?看看应用python是如何实现的
- Python电商爬虫,法国亚马逊商品采集
- Python堆糖网图片爬虫,多进程及多线程的使用例子
- Python Post提交简单案例,文本内容在线语音合成
- Python多线程爬虫,主播信息资料爬取采集
- 基于Tensorflow2 Lite在Android手机上实现图像分类
- Python知乎专栏爬虫,pdfkit专栏文章制作PDF电子书
- Python爬虫练手,一个简单的Python资讯采集案例
- Python与seo,百度关键词相关搜索关键词采集源码
- istio请求路由分析
- [剑指]2空格替换
- (补充)SPAN+AVISPA for Verifying Cryptographic Protocols
- 如何修改终端中$符号前面的一串名称?