转载

Quartz官方教程翻译系列-Lesson 4

原文地址: http://www.quartz-scheduler.o...

第4课: 触发器更多相关

好像任务一样,触发器也很容易使用,但在充分利用Quartz之前,你需要了解和理解它包含的各种可定制选项。正如前面提到,这里有各种不同的触发器你可以选择其中符合不同任务调度需要的。

你将会在第5课:简单触发器和第6课:Cron触发器学习到这两种最常用的触发器类型。

常见触发器属性:

除了所有触发器类型都具有用于跟踪其标识的TriggerKey属性外,这里有其他属性是触发器类型共有的。这些公用的属性通过 TriggerBuilder 设置当你构建触发器定义的时候(下面会有例子)。

这里是所有触发器类型的共有属性清单:

  • "jobKey" 属性指示触发器触发是应执行的任务的标识
  • "startTime"属性指示触发器的任务调度的生效时间。值是一个 java.util.Date 对象定义了一个指定的日历时间。对于某些触发器类型,触发器会真实触发在开始时间,而对其他它只是简单的标记任务调度应该开始的时间。这意味着你可以存储一个任务调度的触发器好像“每个月的5号”在一月份,并且如果开始属性设置为 4月1号,那么离触发器触发还有几个月。
  • "endTime" 属性指示触发器的任务调度应该不在有效。另一个说法,一个触发器伴随任务调度"每月5号"而且结束时间在七月1号,那么它的最后触发时间为6月5号。

其他属性,我们会再作解释和讨论留待下面的子章节。

优先级

有时候,当你有多个触发器(或者少数工作线程在你的 Quartz 线程池),Quartz 可能没有足够的资源去触发所有的触发器因而在同一时间触发任务调度。在这种情况下,你可能想要控制那个触发器首先获得 Quartz 的工作线程。为了这个目的,你可以设置 priorty 属性在触发器上。如果 N个触发器同时触发,但这里只有Z个工作线程是可用,那么前伴随最高优先级的Z个触发器会先执行。如果你没有设置触发器的优先级,那么他会用默认的优先级 5 。任何整型允许被用来设置优先级,正数,负数。

注意: 优先级仅在触发器同时被触发的情况下。一个触发器调度任务在10::59触发会在一个 11:00 任务调度前触发。

注意:当一个触发器的任务检测到需要恢复,任务调度的恢复后的优先级会跟原来的触发器一致。

哑火命令

触发器的另一个重要的属性是“哑火命令”。哑火出现在当一个持续的触发器在触发的时候由于执行调度被关闭导致的失败,或者因为在 Quartz 的线程池中没有可用的线程执行任务。不同的触发器类型又不同的哑火提示对应他们。默认他们使用一个聪明策略说明-有基于触发器配置的动态的行为。当任务调度开始,它会搜索哑火的触发器,然后根据他们各自配置的哑火指令去更新它们。当你开始使用 Quartz 在你的项目中,你应该让自己熟悉哑火命令定义指定的触发器类型,并在JavaDoc上解释它们。更多关于哑火命令的指定的命令会在教程讨论到特定触发器类型的时候给出。

日历

Quartz 日历 对象(并不是 java.util.Calendar 对象) 可以定义触发器并关联,存储触发器在任务调度。日历对于从触发器的触发时间表中排除时间段很有用。举例,你可以创建一个每周末 9::3 am的触发器,但增加一个日历排除全部的公众假期。

日历可以是任何实现了 Calendar 接口的的序列化对象,好像这样:

package org.quartz;

public interface Calendar {

  public boolean isTimeIncluded(long timeStamp);

  public long getNextIncludedTime(long timeStamp);

}

注意到这些方法的参数都是 long 类型。正如你所猜,他们是timestamp 的微秒类型。这意味日历可以屏蔽的时间间隔达到微秒级。适当地,你对一整天的封闭感兴趣。方便地,Quartz 包含类 org.quartz.impl.HolidayCalendar ,正是如此。

日历必须实例化并通过 addCalendar(...) f方法注册到任务调度。如果你使用 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

构建触发器的详细信息会在下面的课程中给出。现时为止,只要相信上面代码创建两个触发器,每个任务调度日常触发。然而,在日历排除的期间内将发生的任何触发都将被跳过。

org.quartz.impl.calendar  包的多个日历实现获取你所需。

本文由博客一文多发平台 OpenWrite 发布!

原文  https://segmentfault.com/a/1190000021173289
正文到此结束
Loading...