`
thinktothings
  • 浏览: 781997 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Lesson 6: CronTrigger

阅读更多

Quartz Enterprise Job Scheduler Tutorial

Lesson 6: CronTrigger

CronTrigger is often more useful than SimpleTrigger, if you need a job-firing schedule that recurs based on calendar-like notions, rather than on the exactly specified intervals of SimpleTrigger.

With CronTrigger, you can specify firing-schedules such as "every Friday at noon", or "every weekday and 9:30 am", or even "every 5 minutes between 9:00 am and 10:00 am on every Monday, Wednesday and Friday during January".

Even so, like SimpleTrigger, CronTrigger has a startTime which specifies when the schedule is in force, and an (optional) endTime that specifies when the schedule should be discontinued.

Cron Expressions

Cron-Expressions are used to configure instances of CronTrigger. Cron-Expressions are strings that are actually made up of seven sub-expressions, that describe individual details of the schedule. These sub-expression are separated with white-space, and represent:

  1. Seconds
  2. Minutes
  3. Hours
  4. Day-of-Month
  5. Month
  6. Day-of-Week
  7. Year (optional field)

An example of a complete cron-expression is the string "0 0 12 ? * WED" - which means "every Wednesday at 12:00:00 pm".

Individual sub-expressions can contain ranges and/or lists. For example, the day of week field in the previous (which reads "WED") example could be replaced with "MON-FRI", "MON,WED,FRI", or even "MON-WED,SAT".

Wild-cards (the '*' character) can be used to say "every" possible value of this field. Therefore the '*' character in the "Month" field of the previous example simply means "every month". A '*' in the Day-Of-Week field would therefore obviously mean "every day of the week".

All of the fields have a set of valid values that can be specified. These values should be fairly obvious - such as the numbers 0 to 59 for seconds and minutes, and the values 0 to 23 for hours. Day-of-Month can be any value 0-31, but you need to be careful about how many days are in a given month! Months can be specified as values between 0 and 11, or by using the strings JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV and DEC. Days-of-Week can be specified as values between 1 and 7 (1 = Sunday) or by using the strings SUN, MON, TUE, WED, THU, FRI and SAT.

The '/' character can be used to specify increments to values. For example, if you put '0/15' in the Minutes field, it means 'every 15th minute of the hour, starting at minute zero'. If you used '3/20' in the Minutes field, it would mean 'every 20th minute of the hour, starting at minute three' - or in other words it is the same as specifying '3,23,43' in the Minutes field. Note the subtlety that "*/35" does not mean "every 35 minutes" - it mean "every 35th minute of the hour, starting at minute zero" - or in other words the same as specifying '0,35'.

The '?' character is allowed for the day-of-month and day-of-week fields. It is used to specify "no specific value". This is useful when you need to specify something in one of the two fields, but not the other. See the examples below (and CronTrigger JavaDoc) for clarification.

The 'L' character is allowed for the day-of-month and day-of-week fields. This character is short-hand for "last", but it has different meaning in each of the two fields. For example, the value "L" in the day-of-month field means "the last day of the month" - day 31 for January, day 28 for February on non-leap years. If used in the day-of-week field by itself, it simply means "7" or "SAT". But if used in the day-of-week field after another value, it means "the last xxx day of the month" - for example "6L" or "FRIL" both mean "the last friday of the month". You can also specify an offset from the last day of the month, such as "L-3" which would mean the third-to-last day of the calendar month. When using the 'L' option, it is important not to specify lists, or ranges of values, as you'll get confusing/unexpected results.

The 'W' is used to specify the weekday (Monday-Friday) nearest the given day. As an example, if you were to specify "15W" as the value for the day-of-month field, the meaning is: "the nearest weekday to the 15th of the month".

The '#' is used to specify "the nth" XXX weekday of the month. For example, the value of "6#3" or "FRI#3" in the day-of-week field means "the third Friday of the month".

Here are a few more examples of expressions and their meanings - you can find even more in the JavaDoc for org.quartz.CronExpression

Example Cron Expressions

CronTrigger Example 1 - an expression to create a trigger that simply fires every 5 minutes

"0 0/5 * * * ?"

CronTrigger Example 2 - an expression to create a trigger that fires every 5 minutes, at 10 seconds after the minute (i.e. 10:00:10 am, 10:05:10 am, etc.).

"10 0/5 * * * ?"

CronTrigger Example 3 - an expression to create a trigger that fires at 10:30, 11:30, 12:30, and 13:30, on every Wednesday and Friday.

"0 30 10-13 ? * WED,FRI"

CronTrigger Example 4 - an expression to create a trigger that fires every half hour between the hours of 8 am and 10 am on the 5th and 20th of every month. Note that the trigger will NOT fire at 10:00 am, just at 8:00, 8:30, 9:00 and 9:30

"0 0/30 8-9 5,20 * ?"

Note that some scheduling requirements are too complicated to express with a single trigger - such as "every 5 minutes between 9:00 am and 10:00 am, and every 20 minutes between 1:00 pm and 10:00 pm". The solution in this scenario is to simply create two triggers, and register both of them to run the same job.

Building CronTriggers

CronTrigger instances are built using TriggerBuilder (for the trigger's main properties) and CronScheduleBuilder (for the CronTrigger-specific properties). To use these builders in a DSL-style, use static imports:

import static org.quartz.TriggerBuilder.*;
import static org.quartz.CronScheduleBuilder.*;
import static org.quartz.DateBuilder.*:
Build a trigger that will fire every other minute, between 8am and 5pm, every day:
  trigger = newTrigger()
    .withIdentity("trigger3", "group1")
    .withSchedule(cronSchedule("0 0/2 8-17 * * ?"))
    .forJob("myJob", "group1")
    .build();
Build a trigger that will fire daily at 10:42 am:
  trigger = newTrigger()
    .withIdentity("trigger3", "group1")
    .withSchedule(dailyAtHourAndMinute(10, 42))
    .forJob(myJobKey)
    .build();

- or -

  trigger = newTrigger()
    .withIdentity("trigger3", "group1")
    .withSchedule(cronSchedule("0 42 10 * * ?"))
    .forJob(myJobKey)
    .build();
Build a trigger that will fire on Wednesdays at 10:42 am, in a TimeZone other than the system's default:
  trigger = newTrigger()
    .withIdentity("trigger3", "group1")
    .withSchedule(weeklyOnDayAndHourAndMinute(DateBuilder.WEDNESDAY, 10, 42))
    .forJob(myJobKey)
    .inTimeZone(TimeZone.getTimeZone("America/Los_Angeles"))
    .build();

- or -

  trigger = newTrigger()
    .withIdentity("trigger3", "group1")
    .withSchedule(cronSchedule("0 42 10 ? * WED"))
    .inTimeZone(TimeZone.getTimeZone("America/Los_Angeles"))
    .forJob(myJobKey)
    .build();

CronTrigger Misfire Instructions

The following instructions can be used to inform Quartz what it should do when a misfire occurs for CronTrigger. (Misfire situations were introduced in the More About Triggers section of this tutorial). These instructions are defined as constants on CronTrigger itself (including JavaDoc describing their behavior). The instructions include:

Misfire Instruction Constants of CronTrigger
MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY
MISFIRE_INSTRUCTION_DO_NOTHING
MISFIRE_INSTRUCTION_FIRE_NOW

All triggers also have the Trigger.MISFIRE_INSTRUCTION_SMART_POLICY instruction available for use, and this instruction is also the default for all trigger types. The 'smart policy' instruction is interpreted by CronTrigger as MISFIRE_INSTRUCTION_FIRE_NOW. The JavaDoc for the CronTrigger.updateAfterMisfire() method explains the exact details of this behavior.

When building CronTriggers, you specify the misfire instruction as part of the simple schedule (via CronSchedulerBuilder):

  trigger = newTrigger()
    .withIdentity("trigger3", "group1")
    .withSchedule(cronSchedule("0 0/2 8-17 * * ?")
        ..withMisfireHandlingInstructionFireAndProceed())
    .forJob("myJob", "group1")
    .build();
分享到:
评论

相关推荐

    Lesson 1: Using Quartz

    《Lesson 1: 使用Quartz》 在IT领域,任务调度是系统自动化的重要组成部分,而Quartz是一款功能强大且广泛使用的Java作业调度框架。本文将深入探讨如何利用Quartz进行任务管理和执行,以及其在实际项目中的应用。 ...

    CronTrigger

    ### CronTrigger 在 Spring Quartz 定时任务中的应用 #### 一、CronTrigger 概述 CronTrigger 是 Spring Quartz 框架中用于定义基于日历规则的任务调度的一种方式。与 SimpleTrigger 相比,CronTrigger 提供了更...

    CronTrigger的未触发指令学习

    【标题】:“CronTrigger的未触发指令学习” 在任务调度的世界里,CronTrigger是Quartz库中的一个核心组件,用于根据特定的cron表达式执行任务。CronTrigger允许我们按照时间表(如每日、每周或每小时)来安排我们...

    CronTrigger配置格式

    CronTrigger是Quartz调度框架中的一个重要组件,用于根据预定义的时间规则触发任务。它的配置格式灵活且强大,能够满足各种复杂的定时需求。下面将详细解释CronTrigger的配置格式和通配符的使用。 配置格式如下: ...

    关于quartz中CronTrigger的使用说明

    ### 关于Quartz中CronTrigger的使用说明 在Quartz调度器中,`CronTrigger`是一种基于Cron表达式的触发器,它允许我们按照类似Unix/Linux操作系统中的Cron任务的方式来定义执行时间表。通过CronTrigger,我们可以...

    Quartz CronTrigger配置说明

    ### Quartz CronTrigger配置详解 #### 一、CronTrigger简介 CronTrigger 是 Quartz 调度器中一种非常强大的任务触发机制,它基于类似于 Unix cron 的表达式来定义任务的执行时间。CronTrigger 表达式由七个或八个...

    定时器quartz的应用

    Quartz提供多种触发器,如SimpleTrigger(简单触发器)和CronTrigger(基于cron表达式的触发器)。 2. **调度器Scheduler**: Scheduler是Quartz的核心组件,负责管理和执行所有的Job和Trigger。通过`org.quartz....

    qutarz.使用方法

    CronTrigger cronTrigger = new CronTrigger("myTrigger", "myGroup", "myJob", "myJobGroup", new Date(), new Date(System.currentTimeMillis() + 365 * 24 * 60 * 60 * 1000), "0 0 9 ? * MON-FRI", TimeZone....

    quartz的小demo

    6. **监控与管理** - **Quartz管理界面**:Quartz提供了一个简单的Web管理界面,可以查看和操作所有调度的任务。 - **自定义监控**:结合SpringMVC,可以构建自己的任务监控界面,更灵活地控制和展示任务状态。 ...

    quartz实例,quartz入门例子

    6. **启动Scheduler**:在应用启动时,调用Scheduler的start()方法开始调度。 在这个Quartz入门例子中,可能包含了一个名为`QuarzTest`的类或配置文件,它是实际运行的入口。通过分析和运行这个例子,你可以了解到...

    quartz示例

    6. **集群支持**:Quartz支持集群,可以在多台服务器上部署,当一台服务器故障时,其他服务器可以接管任务,提供高可用性。 7. **持久化**:Quartz可以将Job和Trigger的信息存储在数据库中,保证系统重启后仍然能够...

    Quartz中文API

    6. **监听器**: Quartz提供了JobListener和TriggerListener接口,可以监听Job和Trigger的生命周期事件,比如开始、结束、完成或错误。这有助于进行日志记录、监控和异常处理。 7. **并发与集群**: Quartz支持多线程...

    quartz-2.1.7

    6. **错误处理**:Quartz 提供了强大的错误处理机制,当任务执行出错时,可以进行重试、跳过或者记录日志。 7. **监控与管理**:Quartz 提供了 Web 管理界面(如 QuartzAdmin),允许开发者监控调度状态,进行在线...

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

    6. **Quartz 手册 java 版-(六)CronTrigger**:CronTrigger 允许开发者使用类似 Unix cron 表达式的方式来定义执行时间,提供灵活的按日期和时间的调度能力。 7. **Quartz 手册 java 版-(七)TriggerListeners 和 ...

    定时任务quartz及教程

    有多种类型的触发器,如SimpleTrigger(简单触发器)和CronTrigger(基于CRON表达式的触发器)。 3. 调度器(Scheduler):调度器是Quartz的核心,负责管理和执行作业与触发器的组合。 4. 作业存储(JobStore):...

    spring quartz

    5. **CronTrigger**:CronTrigger允许我们使用cron表达式来定义触发任务的频率,这种表达式可以非常灵活地定义各种时间间隔。 6. **Spring的集成**:Spring通过`org.springframework.scheduling.quartz`包提供了与...

    Quartz Scheduler入门

    6. JobDataMap:每个JobDetail可以包含一个JobDataMap,这是一个键值对集合,用于传递参数或配置信息给Job实例。 7. Quartz集群:Quartz还支持集群部署,可以将多个Scheduler实例组成集群,提供高可用性和故障转移...

    Quartz Job Scheduling Framwork中文文档

    4. **CronTrigger**:CronTrigger允许基于cron表达式设定触发时间,提供更复杂的调度能力,如按星期几、小时、分钟等进行调度。 5. **SimpleTrigger**:SimpleTrigger是最简单的触发器,用于设定固定间隔的重复执行...

    quartz定时调度器动态修改时间不用配置文件

    6. **启动Scheduler**:最后,启动Scheduler以开始执行任务。 ```java scheduler.start(); ``` 在实际应用中,我们可以根据业务需求,比如数据库中的定时任务配置,动态生成和修改CronTrigger。这样,我们就可以...

    quartz小项目

    6. **集群支持**:Quartz支持多节点集群,这意味着多个Scheduler实例可以在不同服务器上运行,它们可以共享并协调任务,保证任务的准确执行。 7. **监听器**:Quartz提供了JobListener和TriggerListener,你可以...

Global site tag (gtag.js) - Google Analytics