Quartz.net官方开发指南 第四课:关于Triggers更多内容

本文深入探讨了Quartz Scheduler中的Triggers概念,包括如何使用Calendars排除特定时间段,MisfireInstructions处理未触发情况,以及如何利用TriggerUtils简化触发器创建。此外还介绍了TriggerListeners的作用。

Job一样,trigger非常容易使用,但它有一些可选项需要注意和理解,同时,trigger有不同的类型,要按照需求进行选择。 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

Calendars——日历

Quartz Calendar对象在trigger被存储到scheduler时与trigger相关联。Calendar对于在trigger触发日程中的采用批量世间非常有用。例如:你想要创建一个在每个工作日上午930触发一个触发器,那么就添加一个排除所有节假日的日历。

Calendar可以是任何实现Calendar接口的序列化对象。看起来如下;

None.gifusingSystem;
None.gif
None.gif
usingQuartz.Impl.Calendar;
None.gif
None.gif
namespaceQuartz
None.gif
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif
/**////<summary>
InBlock.gif
InBlock.gif
///Aninterfacetobeimplementedbyobjectsthatdefinespacesoftimeduring
InBlock.gif
InBlock.gif
///whichanassociated<seecref="Trigger"/>mayfire.
InBlock.gif
InBlock.gif
///</summary>
InBlock.gif
InBlock.gif
///<remarks>
InBlock.gif
InBlock.gif
///Calendarsdonotdefineactualfiretimes,butratherareusedtolimita
InBlock.gif
InBlock.gif
///<seecref="Trigger"/>fromfiringonitsnormalscheduleifnecessary.Most
InBlock.gif
InBlock.gif
///Calendarsincludealltimesbydefaultandallowtheusertospecifytimesto
InBlock.gif
InBlock.gif
///exclude.Assuch,itisoftenusefultothinkofCalendarsasbeingusedto
InBlock.gif
InBlock.gif
///<i>exclude</i>ablockoftime,asopposedto<i>include</i>
InBlock.gif
InBlock.gif
///ablockoftime.(i.e.theschedule&quot;fireeveryfiveminutesexceptonSundays&quot;couldbe
InBlock.gif
InBlock.gif
///implementedwitha<seecref="SimpleTrigger"/>anda<seecref="WeeklyCalendar"/>whichexcludesSundays)
InBlock.gif
InBlock.gif
///</remarks>
InBlock.gif
InBlock.gif
///<author>JamesHouse</author>
InBlock.gif
ExpandedSubBlockEnd.gif
///<author>JuergenDonnerstag</author>

InBlock.gif
InBlock.gif
publicinterfaceICalendar
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif
/**////<summary>
InBlock.gif
InBlock.gif
///Getsorsetsadescriptionforthe<seecref="ICalendar"/>instance-maybe
InBlock.gif
InBlock.gif
///usefulforremembering/displayingthepurposeofthecalendar,though
InBlock.gif
InBlock.gif
///thedescriptionhasnomeaningtoQuartz.
InBlock.gif
ExpandedSubBlockEnd.gif
///</summary>

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif
stringDescriptiondot.gif{get;set;}
InBlock.gif
InBlock.gif
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif
/**////<summary>
InBlock.gif
InBlock.gif
///Setanewbasecalendarorremovetheexistingone.
InBlock.gif
InBlock.gif
///Getthebasecalendar.
InBlock.gif
ExpandedSubBlockEnd.gif
///</summary>

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gifICalendarCalendarBase
dot.gif{set;get;}
InBlock.gif
InBlock.gif
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif
/**////<summary>
InBlock.gif
InBlock.gif
///Determinewhetherthegiventimeis'included'bythe
InBlock.gif
InBlock.gif
///Calendar.
InBlock.gif
ExpandedSubBlockEnd.gif
///</summary>

InBlock.gif
InBlock.gif
boolIsTimeIncluded(DateTimetime);
InBlock.gif
InBlock.gif
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif
/**////<summary>
InBlock.gif
InBlock.gif
///Determinethenexttimethatis'included'bythe
InBlock.gif
InBlock.gif
///Calendarafterthegiventime.
InBlock.gif
ExpandedSubBlockEnd.gif
///</summary>

InBlock.gif
InBlock.gifDateTimeGetNextIncludedTime(DateTimetime);
InBlock.gif
ExpandedSubBlockEnd.gif}

InBlock.gif
ExpandedBlockEnd.gif}

None.gif
None.gif


注意,这些方法的参数都是DateTime型,你可以猜想出,它们的时间戳是毫秒的格式。这意味日历能够排除毫秒精度的时间。最可能的是,你可能对排除整天的时间感兴趣。为了提供方便,Quartz提供了一个Quartz.Impl.Calendar.HolidayCalendar,这个类可以排除整天的时间。

Calendars必须被实例化,然后通过AddCalendar (..)方法注册到scheduler中。如果使用HolidayCalendar,在实例化之后,你可以使用它的AddExcludedDate (DateTime excludedDate))方法来定义你想要从日程表中排除的时间。同一个calendar实例可以被用于多个trigger中,如下:

Using Calendars

None.gifICalendarcronCalendar=newCronCalendar("0/5****?");
None.gif
None.gifICalendarholidayCalendar
=newHolidayCalendar();
None.gif
None.gifsched.AddCalendar(
"cronCalendar",cronCalendar,true,true);
None.gif
None.gifsched.AddCalendar(
"holidayCalendar",holidayCalendar,true,true);
None.gif
None.gifJobDetailjob
=newJobDetail("job_"+count,schedId,typeof(SimpleRecoveryJob));
None.gif
None.gifSimpleTriggertrigger
=newSimpleTrigger("trig_"+count,schedId,20,5000L);
None.gif
None.giftrigger.AddTriggerListener(
newDummyTriggerListener().Name);
None.gif
None.giftrigger.StartTime
=DateTime.Now.AddMilliseconds(1000L);
None.gif
None.gifsched.ScheduleJob(job,trigger);
None.gif
None.gif

传入SimpleTrigger构造函数的参数的细节将在下章中介绍。但是,任何在日历中被排除的时间所要进行的触发都被取消。

Misfire Instructions——未触发指令

Trigger的另一个重要属性就是它的misfire instruction(未触发指令)。如果因为scheduler被关闭而导致持久的触发器错过了触发时间,这时,未触发就发生了。不同类型的触发器有不同的未触发指令。缺省情况下,他们会使用一个智能策略指令——根据触发器类型和配置的不同产生不同动作。当scheduler开始时,它查找所有未触发的持久triggers,然后按照每个触发器所配置的未触发指令来更新它们。开始工程中使用Quartz的时,应熟悉定义在各个类型触发器上的未触发指令。关于未触发指令信息的详细说明将在每种特定的类型触发器的指南课程中给出。可以通过MisfireInstruction属性来为给定的触发器实例配置未触发指令。

TriggerUtils - Triggers Made EasyTriggerUtils——使Triggers变得容易)

TriggerUtils类包含了创建触发器以及日期的便捷方法。使用这个类可以轻松地使触发器在每分钟,小时,日,星期,月等触发。使用这个类也可以产生距离触发最近的妙、分或者小时,这对设定触发开始时间非常有用。

TriggerListeners

最后,如同job一样,triggers可以注册监听器,实现TriggerListener接口的对象将可以收到触发器被触发的通知。

自由、创新、研究、探索……
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值