[译]Java定时任务调度-Quartz文档(四)More About Triggers

来源:互联网 发布:前瞻网数据 编辑:程序博客网 时间:2024/06/05 04:42

和job一样,trigger用起来也很方便,但在使用Quartz之前,需要了解它的一些可配置的地方,同时根据不同的调度需求选择不同的trigger。
Lesson 5和Lesson 6会进一步学习Simple Trigger和Cron Trigger。

Common Trigger Attributes

除了所有的trigger都需要一个TriggerKey来作为唯一标示之外,所有的trigger类型还有一些共通的地方。这些地方都是在定义trigger时通过TriggerBuilder来定义的。
下面介绍下这些通用属性:
- jobkey属性指定了在触发器启动时该执行哪个任务;
- startTime指定第一次启动触发器的时间。它的值是java.util.Date类型,指定一个具体日期的具体时间。对于某些trigger类型,会在指定的开始时间启动,对于另一些,会结合scheduler来确定何时启动。比如scheduler的调度时间是二月的每个周五,而job的startTime属性这是的是三月一号,那么触发器启动要等快一年了。
- endTime属性指定从何时起不再调度。换句话说,如果scheduler的调度时间是每个月的第五天,而endTime是七月一号,那么最后一次调度时间为六月五号;
剩下的属性将在下节讨论。

Priority

有时候,配置了很多触发器,在同一时间没有那么多的进程或者资源同时触发所有触发器,那么就需要确定哪个trigger优先执行。为此,就需要对trigger指定优先级。如果同一时间指定了N个触发器,但只有Z个执行进程,那么前Z个触发器将会被先启动。优先级可以是任意整数类型,正数和负数都可以。如果没有指定,将会使用默认值5。
注:1、优先级比较是基于同时触发的情况下的,换句话说,先触发的trigger肯定会比后出发的trigger先执行,那么时间只差了1秒。
2、如果触发器是恢复某个中断的job,那么此次执行和之前的trigger具有相同的优先级。

Misfire Instructions

Trigger的另一个重要属性是“misfire instruction”。“misses”(错过)指的是trigger错过了正常的启动时间,一般是由于scheduler关闭或者同时触发的trigger太多导致(上节提到过,优先级不够会不执行)。不同的trigger类型有不同的“misfire instruction”。默认使用’smart policy’策略,该策略基于不同的trigger类型和配置会有不同的行为。当调度器启动时,会查找所有错过的持久化的trigger,然后会根据他们的“misfired instruction”配置信息更新它们。在项目中使用Quartz,应该熟悉这些不同类型trigger的“misfired instruction”,关于“misfired instruction”更多的细节将在后续课程提到每种trigger类型是讲解。

Calendars

在trigger被定义并关联到scheduler时,可以关联Quartz Calendar对象(不是java.util.Calendar对象)。Calendars主要用来针对trigger的调度时间排除掉某段时间。例如你可以定义一个trigger,在每个工作日的9:30,同时添加一个Calendars,排除掉节假日。
Calendars可以是实现了Calendars接口的可序列化对象,像下面这样:

The Calendar Interface

package org.quartz;public interface Calendar {  public boolean isTimeIncluded(long timeStamp);  public long getNextIncludedTime(long timeStamp);}

注意这些方法的参数都是long类型。如你所想,它们都是以毫秒为单位的时间戳。这意味着Calendars的限定范围是精确到毫秒的。如果你想排除一整天,Quart中的org.quartz.impl.HolidayCalendar可以试试。

Calendars必须由scheduler通过addCalendar方法实例化和注册。如用HolidayCalendar,实例化之后,可以调用其addExcludedDate方法来添加想排除的日期。同一个calendar可以被多个trigger使用,像这样:

Calendar Example

HolidayCalendar cal = new HolidayCalendar();cal.addExcludedDate( someDate );cal.addExcludedDate( someOtherDate );sched.addCalendar("myHolidays", cal, false);Trigger t = newTrigger()    .withIdentity("myTrigger")    .forJob("myJob")    .withSchedule(dailyAtHourAndMinute(9, 30)) // execute job daily at 9:30    .modifiedByCalendar("myHolidays") // but not on holidays    .build();// .. schedule job with triggerTrigger t2 = newTrigger()    .withIdentity("myTrigger2")    .forJob("myJob2")    .withSchedule(dailyAtHourAndMinute(11, 30)) // execute job daily at 11:30    .modifiedByCalendar("myHolidays") // but not on holidays    .build();// .. schedule job with trigger2

创建trigger的更多细节将在后续介绍,这里只是创建了两个每天执行的trigger,但是calendar指定的日期将被跳过。
查看org.quartz.impl.calendar,根据你的需求选择Calendar。

原文链接:
http://www.quartz-scheduler.org/documentation/quartz-2.2.x/tutorials/tutorial-lesson-04.html

0 0
原创粉丝点击