Quartz2.2.x官方文档2.2.X—第三章 4.关于更多Triggers

Quartz 教程


Table of Contents | ‹ Lesson 3 | Lesson 5 ›

课程 4: 关于更多Triggers

就像jobs一样,triggers可以快速、容易的使用,但是多种多样的自定义参数,在你完全使用Quartz之前,你需要去了解和知道。 另外,正如前面所说,你可以选择不同类型的触发器来满足不同的调度需求。

Lesson 5: Simple Triggers and Lesson 6: Cron Triggers你会了解到两种最常用的触发器类型。

常用Trigger属性

除了所有类型的触发器都有TriggerKey属性来作为跟踪标识外,还有一些其他属性也适用在所有触发器类型。当你需要构造触发器时,可以使用TriggerBuilder来设置通用属性。(下面将会有例子).

下面是所有类型触发器的通用属性列表:

  • “jobKey”属性表名当触发器触发时应该被执行的job标识。
  • “startTime”属性会对触发器调度程序的首次执行产生影响。这个值是java.util.Date对象,是指定日历上的一个时间。对于有些类型的触发器,触发器通常在start time时间被触发,而有些类型则尽量遵从这个标志时间。这个含义是,你可以在一月份,保存一个每月第5天调度程序触发器,如果startTime属性设置为四月1号,那么离触发器第一次触发还有好几个月。
  • “endTime”属性表名调度程序不会生效。另一方面, 一个每月第五天执行的调度任务触发器,结束时间为七月一号,那么6月5号会执行最后一次。

其他属性,会在下面小结中有其他更多解释。

优先级

有时,当你大量的大量的Triggers(或者你的Quartz线程池有许多工作任务),Quartz可能没有资源触发所有Triggers在同一时间执行调度任务。因此,你可能想要控制你的Tiggers在可获得Quartz工作线程上首先启动。为此,你可以在Tigger上设置优先级属性。如果N个Triggers在同一时间触发,但是只有Z个工作线程能在同时被获得,那么首先高优先级的ZTriggers会首先执行。如果Triggers没有设置优先级,它会使用默认5作为默认属性。优先级可以设置为任何整数,无论正负。

注意: 只有当触发器有相同触发时间时才有优先级比较。一个10:59的触发器调度任务总是会在11:00的调度程序之前触发。

注意: 当一个触发器在异常中恢复,它恢复的是原始触发器的优先级。

Misfire Instructions

另一个触发器的重要属性是"misfire instruction"。如果调度任务因为关闭或者无法从Quartz线程池中获得线程执行任务,将会导致错误发生。不同的触发器类型有不同的错误指令。默认使用智能策略指令 - 它具有基于触发器类型和配置的动态行为。当调度任务开始,它会搜索任何被有错误的触发器,它会基于它们每一个配置的错误指令来更新。当你开始使用Quartz项目时,你应该熟悉给定的触发器类型的错误指令和他们的Javadoc。关于更多错误指令的信息将会在每种触发器类型的教程中给出。

Calendars

Quartz Calendar 对象(没有java.util.Calendar对象)能够在trigger定义时关联触发器,并定义在调度程序中。Calendars能够用来在触发器触发的调度程序中排除时间快。例如,你可以创建一个触发器在每个工作日9:30AM触发,接着可以添加一个Calendar排除所有节假日。

Calendar可以是任何序列画的对象,只要他们实现Calendar接口,看起来像这样:

The Calendar Interface


package org.quartz;

public interface Calendar {

  public boolean isTimeIncluded(long timeStamp);

  public long getNextIncludedTime(long timeStamp);

}

注意这些方法的参数是long类型。就如你推测的那样,它们是毫米级的时间戳格式。这就意味着calendars能够将时间限制在毫米级别。最有可能的是,你可能对整天的限制感兴趣。作为一种便利条件,Quartz包含一个类org.quartz.impl.HolidayCalendar。

Calendars必须实例化和通过addCalendar(..)方法注册到调度程序。如果你使用HolidayCalendar, 在它实例化后, 你可以使用 addExcludedDate(Date date)方法,可以在调度程序中排除你希望的日期。同一个日历实例可以与多个触发器一起使用,例如:

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 trigger

Trigger 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

关于triggers的构造/构建细节会在未来几课中细讲。现在,只要相信代码创建了两个触发器,并且每个调度任务都可以触发即可。不论怎样, 任何在日历排除期间的触发都会被跳过。

org.quartz.impl.calendar包,关于一些Clalendar的实现可能满足你的需要。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章