`
no_bao
  • 浏览: 316582 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Quartz使用指南(四)-----触发器(Triggers)

阅读更多

4 触发器(Triggers)

与Job相比,Trigger相对来说比较简单容易,但是要能完全的掌握使用Quartz,使其包含各种自定义的时间表选项,我们必须先知道和理解Trigger。

4.1 日历(Calendars)

Quartz Calendar 对象(不是java.util.Calendar对象)能够与被注册进Scheduler的Trigger关联。Calendar对排除Trigger的时间段是很有用的,例如,我们可以创建一个在每个工作日上午9:30触发Job的Trigger,就在其中增加一个排除所有工作假期的Calendar。

Calendar可以是任何实现Calendar接口的可序列化对象,如下所示:

package org.quartz;

  public interface Calendar {

    public boolean isTimeIncluded(long timeStamp);

    public long getNextIncludedTime(long timeStamp);

  }

该接口的参数都是long类型的,以毫秒为单位的timestamp;所以Calendar定义的时间可以准确到毫秒。很可能,我们需要排除一整天,为了方便,Quartz包含了实现该功能的类ori.quartz.impl.HolidayCalendar。

Calendar必须实例化并且通过addCalendar(…)方法注册到Scheduler中,如果使用HolidayCalendar,在实例化之后,我们需要使用方法addExcludedDate(Date date)排除我们计划日程中不需要的日期,一个Calendar实例可以用到不同的Trigger中,比如:

HolidayCalendar cal = new HolidayCalendar();

  cal.addExcludedDate( someDate );

  sched.addCalendar("myHolidays", cal, false);

  SimpleTrigger trigger = new SimpleTrigger("myTrigger",

                                            sched.DEFAULT_GROUP,

                                            new Date(),

                                            null,

SimpleTrigger.REPEAT_INDEFINITELY,

                                            60L * 1000L);

  trigger.setCalendarName("myHolidays");

  // .. schedule job with trigger

  SimpleTrigger trigger2 = new SimpleTrigger("myTrigger",

                                             sched.DEFAULT_GROUP,

                                             new Date(),

                                             null,

                                             5,

                                      5L * 24L * 60L * 60L * 1000L);

  trigger2.setCalendarName("myHolidays");

  // .. schedule job with trigger2

上面代码,我们创建了两个Trigger:一个是每1分钟执行触发一次,没有次数限制;另一个是每5天执行触发一次,共执行5次触发;然而,任何在Calendar中被排除的时间段的触发执行都将被取消。

4.2 过时触发指令(Misfire Instructions)

Trigger另一个重要的属性是“Misfire Instruction”。过时触发发生在持久Trigger失去了触发时间,由于对应的Scheduler被关闭的原因;不同的Trigger类型有不同的过时触发指令,默认情况下是使用“smart policy”指令,该指令根据Trigger类型和配置具有动态的行为。当scheduler启动时,它将搜索所有过时触发的持久Trigger,并同时根据它们各自所配置的过时触发指令进行更新;当我们在项目中要使用Quartz时,我们必须熟悉所要使用的Trigger类型的过时触发指示,在对应的JavaDOC中有对其进行说明。可以通过方法setMisfireInstruction(…)来设置Trigger的过时触发指示。

4.3 触发器的辅助类(TriggerUtils)

提供了方便,可以使我们不TriggerUtils类(在org.quartz.helpers包中)为我们创建Trigger和触发时间用java.util.Calendar对象。使用辅助类能够很容易地创建基于每分钟、小时、天、周和月等触发的触发器,也可以创建各种各样的日期――对设置触发器的启动时间很有用。

4.4 触发器的监听器(TriggerListeners)

Trigger能够像Job一样,可以把监听器注册到Trigger中,实现了接口TriggerListener的对象就可以接收到Trigger触发时的通知。

4.5 Simple触发器(SimpleTrigger)

当我们需要在规定的时间执行一次或在规定的时间段以一定的时间间隔重复触发执行Job时,SimpleTrigger就可以满足上述要求。

SimpleTrigger的属性有:开始时间、结束时间、重复次数和重复的时间间隔,重复次数属性的值可以为0、正整数、或常量SimpleTrigger.REPEAT_INDEFINITELY,重复的时间间隔属性值必须为0或长整型的正整数,以毫秒作为时间单位,当重复的时间间隔为0时,意味着与Trigger同时触发执行(或几乎与Scheduler开始时同时触发执行)。

如果有指定结束时间属性值,则结束时间属性优先于重复次数属性,这样的好处在于:当我们需要创建一个每间隔10秒钟触发一次直到指定的结束时间的Trigger,而无需去计算从开始到结束的所重复的次数,我们只需简单的指定结束时间和使用REPEAT_INDEFINITELY作为重复次数的属性值即可(我们也可以指定一个比在指定结束时间到达时实际执行次数大的重复次数)。

SimpleTrigger有几个不同的构造方法,我们只对下面这个进行分析:

 

public SimpleTrigger(String name, String group, Date startTime,                       Date endTime, int repeatCount, long repeatInterval)

 

SimpleTrigger例1――创建一个在当前之后10秒钟触发的,执行一次的Trigger

long startTime = System.currentTimeMillis() + 10000L;

  SimpleTrigger trigger = new SimpleTrigger("myTrigger",

                                            sched.DEFAULT_GROUP,

                                            new Date(startTime),

                                            null,

                                            0,

                                            0L);

 

SimpleTrigger例2――创建一个立即触发的,并每间隔60秒钟重复触发执行一次的Trigger

SimpleTrigger trigger = new SimpleTrigger("myTrigger",

                                            sched.DEFAULT_GROUP,

                                            new Date(),

                                            null,

                                      SimpleTrigger.REPEAT_INDEFINITELY,

                                            60L * 1000L);

 

SimpleTrigger例3――创建一个立即触发,每间隔10秒钟重复触发执行一次,开始时间为当前,结束时间为40秒钟后的Trigger

long endTime = System.currentTimeMillis() + 40000L;

  SimpleTrigger trigger = new SimpleTrigger("myTrigger",

                                            sched.DEFAULT_GROUP,

                                            new Date(),

                                            new Date(endTime),

                                      SimpleTrigger.REPEAT_INDEFINITELY,

                                            10L * 1000L);

 

SimpleTrigger例4――创建一个在2005年5月8日早上10:30触发的,每间隔30秒钟重复触发执行一次,并且重复执行5次(总共触发执行6次)的Trigger

java.util.Calendar cal = new java.util.GregorianCalendar(2005, cal.MAY, 8);

  cal.set(cal.HOUR, 10);

  cal.set(cal.MINUTE, 30);

  cal.set(cal.SECOND, 0);

  cal.set(cal.MILLISECOND, 0);

  Data startTime = cal.getTime()

  SimpleTrigger trigger = new SimpleTrigger("myTrigger",

                                            sched.DEFAULT_GROUP,

                                            startTime,

                                            null,

                                            5,

                                            30L * 1000L);

4.6 Simple触发器的过时触发指令(SimpleTrigger Misfire Instructions)

SimpleTrigger有几个用于当过时触发发生时向Quartz通知如何执行的指令,这些指令作为常量定义在SimpleTrigger类中,分别如下:

  MISFIRE_INSTRUCTION_FIRE_NOW

  MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT

  MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT

  MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT

  MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_EXISTING_COUNT

我们也可以使用前面讨论的Trigger.MISFIRE_INSTRUCTION_SMART_POLICY,该指令是所有Trigger的默认值。

如果使用“smart policy”,SimpleTrigger将会根据实例中的配置进行动态的选择过时触发指令,JavaDOC中的SimpleTrigger.updateAfterMisfire()方法详细解析了动态选择的内容。


分享到:
评论

相关推荐

    quartz-1.6.6 教程,代码

    - 文档可能包含 Quartz 的使用指南、API 参考以及常见问题解答,对于初学者来说是非常宝贵的资源。 - 特别关注 `JobBuilder` 和 `TriggerBuilder`,它们提供了构建 Job 和 Trigger 的简便方式。 6. **应用场景** ...

    Quartz 开发指南 中文版

    ### Quartz 开发指南知识点梳理 #### 一、Quartz 功能简介 - **特性概述**: - **独立运行**:Quartz 可以嵌入到任何独立的应用中运行。 - **应用服务器集成**:Quartz 可以在应用服务器或者 Servlet 容器中实例...

    quartz-2.2.3-官方文档数据及PDM表结构.zip

    文档部分包含了Quartz的详细使用指南、API参考以及示例,这些内容对于理解Quartz的工作原理和如何在项目中集成它至关重要。以下是一些关键知识点: 1. **作业(Jobs)与触发器(Triggers)**:Quartz的核心概念是...

    Quartz 开发指南(附源码)

    本指南将深入探讨 Quartz 的核心概念、配置与使用方法,并提供源码分析,帮助开发者更高效地利用这一强大工具。 1. **Quartz 基本概念** - **Job**:Job 是实际要执行的任务,是一个实现了 `org.quartz.Job` 接口...

    《Quartz开发指南》pdf

    在《Quartz开发指南》这本书中,你将深入学习到如何配置和使用Quartz,通过实例了解如何定义作业和触发器,以及如何在实际项目中利用Quartz的高级特性进行任务调度。这本书对于理解Quartz的底层机制和实现高效、可靠...

    Quartz开发指南.rar 好东西

    这个"Quartz开发指南.rar"很可能包含了详细的Quartz使用教程和实践案例,是学习和理解Quartz的好资源,尤其适合高校学生进行作业和任务管理的项目。 1. **Quartz简介**: - Quartz是Apache软件基金会下的一个项目...

    Quartz.NET-3.0.7.zip

    1. **任务调度**:它提供了丰富的API来创建、调度和管理作业(Jobs)和触发器(Triggers)。作业是实际要执行的任务,而触发器则定义了何时启动这些任务。 2. **持久性**:Quartz.NET支持将作业和触发器存储在...

    Quartz.NET-2.2 源码

    - **作业(Jobs)和触发器(Triggers)**: 作业是需要执行的任务,触发器定义了何时以及如何执行这些任务。Quartz.NET支持多种触发器类型,如简单触发器、cron触发器等。 - **持久化**: 为了在应用程序重启后还能...

    Quartz详细的开发指南

    ### Quartz 详细的开发指南 #### 一、Quartz 功能简介 Quartz 是一款功能强大的开源任务调度框架,被广泛应用于 Java 应用程序中。它不仅提供了灵活的任务调度方式,还支持各种复杂的触发规则,使得开发者能够在...

    quartz-2.2.1.zip

    - **作业(Jobs)与触发器(Triggers)**:作业是需要执行的任务,而触发器定义了何时执行这些任务。Quartz 支持多种类型的触发器,如简单触发器、cron 触发器等。 - **调度器(Scheduler)**:调度器是 Quartz 的...

    Quartz.NET-0.9.1

    Quartz.NET可以使用多种数据库存储作业和触发器,例如MySQL、SQL Server、Oracle等。 8. **src**:源代码目录,这里包含Quartz.NET的全部源代码,你可以查看并学习其内部工作原理,甚至根据需要进行定制。 Quartz...

    Quartz开发指南

    此外,还有《Quartz开发指南.pdf》,这本书或文档应该会深入讲解Quartz的使用、配置以及最佳实践。 总之,掌握Quartz和其在Spring中的应用,可以帮助开发者有效地管理后台任务,提高系统的自动化程度。通过学习上述...

    Quartz2.2版本开发手册(JAVA)

    #### 1.1 使用Quartz 在使用Quartz Scheduler之前,我们需要先对其进行实例化。这一步骤通常通过`SchedulerFactory`来实现,它是创建`Scheduler`实例的主要方式。下面是一段示例代码,展示了如何实例化并启动一个`...

    Quartz.NET 官方源码及演示例子

    2. **触发器(Triggers)**:触发器定义了作业何时运行的规则。它可以是简单的定时触发,也可以是基于日历事件的触发。 3. **作业存储(Job Store)**:负责存储作业和触发器的状态,确保即使应用程序重启,也能...

    quartz 在WEB中应用小结

    Quartz 是一个开源的工作调度框架,它允许开发者创建、组织和执行作业(Jobs)与触发器(Triggers)。在Web应用程序中,Quartz 可以帮助我们实现定时任务的管理和执行,比如定期备份数据库、发送邮件、清理缓存等。...

    quartz调度系统工具.zip

    - 文档:关于Quartz的使用指南、API文档或最佳实践说明。 通过这些工具,开发者可以更轻松地利用Quartz实现定时任务,提高系统的自动化程度。同时,理解Quartz的工作原理和API,可以帮助你更好地优化任务调度,避免...

    quartz各种数据库的建表语句

    - 使用`org.quartz.plugin.triggHistory`插件可以记录触发器的历史信息。 - 定义任务类(实现`Job`接口)和触发器(如`CronTrigger`或`SimpleTrigger`)。 - 调用`Scheduler`的`start()`方法启动调度器。 总之,...

    quartz案例,包括spring配置设置调度器和入门手册

    以下将详细介绍Quartz的使用、Spring配置以及入门指南。 1. **Quartz基础知识** - **任务与触发器**:在Quartz中,任务被称为`Job`,触发器则是`Trigger`。`Job`定义了要执行的操作,而`Trigger`决定了何时执行。 ...

    quartz实例,quartz入门例子

    这个实例是为初学者设计的,用于帮助理解Quartz的基本概念和使用方式。在MyEclipse 6.0.1环境下,你可以直接运行这个Spring整合Quartz的示例项目,以便深入学习Quartz的调度功能。 Quartz的核心概念包括: 1. **Job...

Global site tag (gtag.js) - Google Analytics