先介绍一下Trigger的常用属性:
- jobKey 标记了Trigger被触发的时候应该被调用的Job的id。
- java.util.Date对象。
- Trigger的调度不再生效的事件。
- priority表示了Trigger的触发优先级,当资源不够用的时候有个原则是:事件考前的Trigger先被触发然后对于同一时间的优先级高的先被触发,默认的优先级是5。
- misfire发生因为持久的触发器错过了它的触发事件,可能因为调度器正在被关闭或者因为
- package org.quartz;
- public interface Calendar {
- public boolean isTimeIncluded(long timeStamp);
- public long getNextIncludedTime(long timeStamp);
- }
Quartz的Calendar对象可以和trigger关联在一起存储在调度器中。Calendar用于排除一些trigger应该被触发的时间。例如你定义了9:30但是你要排除节假日。
- package domyself.dusk.quartz;
- import java.text.SimpleDateFormat;
- import java.util.Calendar;
- import java.util.Date;
- import org.quartz.JobBuilder;
- import org.quartz.JobDetail;
- import org.quartz.JobKey;
- import org.quartz.Scheduler;
- import org.quartz.SchedulerException;
- import org.quartz.SchedulerFactory;
- import org.quartz.SimpleScheduleBuilder;
- import org.quartz.Trigger;
- import org.quartz.TriggerBuilder;
- import org.quartz.impl.StdSchedulerFactory;
- import org.quartz.impl.calendar.HolidayCalendar;
- public class Client {
- public static void main(String[] args) throws SchedulerException {
- final String configFile = "domyself/dusk/quartz/quartz.properties";
- SchedulerFactory factory = new StdSchedulerFactory(configFile);
- Scheduler scheduler = factory.getScheduler();
- <strong>HolidayCalendar cal = new HolidayCalendar();
- scheduler.addCalendar("myHolidays", cal, false,false);</strong>
- // 10秒钟调用一下HelloJob,永远重复下去
- Trigger trigger = TriggerBuilder.newTrigger().startNow()
- .withIdentity("hello")
- .withPriority(6)
- .modifiedByCalendar("myHolidays")
- .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(10))
- .build();
- JobDetail job = JobBuilder.newJob(DumbJob.class)
- .withIdentity("myJob", "group1")
- // name "myJob", group "group1"
- .usingJobData("jobSays", "Hello World!")
- .usingJobData("myFloatValue", 10f).build();
- scheduler.scheduleJob(job, trigger);
- scheduler.start();
- // scheduler.shutdown(true);
- }
- }
SimpleTrigger
- import static org.quartz.TriggerBuilder.*;
- import static org.quartz.SimpleScheduleBuilder.*;
- import static org.quartz.DateBuilder.*:
- SimpleTrigger trigger = (SimpleTrigger) newTrigger()
- .withIdentity("trigger1", "group1")
- .startAt(myStartTime) // some Date
- .forJob("job1", "group1") // identify job with name, group strings
- .build();
- trigger = newTrigger()
- .withIdentity("trigger3", "group1")
- .startAt(myTimeToStartFiring) // if a start time is not given (if this line were omitted), "now" is implied
- .withSchedule(simpleSchedule()
- .withIntervalInSeconds(10)
- .withRepeatCount(10)) // note that 10 repeats will give a total of 11 firings
- .forJob(myJob) // identify job with handle to its JobDetail itself
- .build();
- trigger = (SimpleTrigger) newTrigger()
- .withIdentity("trigger5", "group1")
- .startAt(futureDate(5, IntervalUnit.MINUTE)) // use DateBuilder to create a date in the future
- .forJob(myJobKey) // identify job with its JobKey
- .build();
- trigger = newTrigger()
- .withIdentity("trigger7", "group1")
- .withSchedule(simpleSchedule()
- .withIntervalInMinutes(5)
- .repeatForever())
- .endAt(dateOf(22, 0, 0))
- .build();
- trigger = newTrigger()
- .withIdentity("trigger8") // because group is not specified, "trigger8" will be in the default group
- .startAt(evenHourDate(null)) // get the next even-hour (minutes and seconds zero ("00:00"))
- .withSchedule(simpleSchedule()
- .withIntervalInHours(2)
- .repeatForever())
- // note that in this example, 'forJob(..)' is not called
- // - which is valid if the trigger is passed to the scheduler along with the job
- .build();
- scheduler.scheduleJob(trigger, job);
- MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY
- 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 = newTrigger()
- .withIdentity("trigger7", "group1")
- .withSchedule(simpleSchedule()
- .withIntervalInMinutes(5)
- .repeatForever()
- .withMisfireHandlingInstructionNextWithExistingCount())
- .build();
CronTrigger
- Seconds
- Minutes
- Hours
- Day-of-Month
- Month
- Day-of-Week
- Year (可选)
Field Name | Mandatory | Allowed Values | Allowed Special Characters |
---|---|---|---|
Seconds | YES | 0-59 | , - * / |
Minutes | YES | 0-59 | , - * / |
Hours | YES | 0-23 | , - * / |
Day of month | YES | 1-31 | , - * ? / L W |
Month | YES | 1-12 or JAN-DEC | , - * / |
Day of week | YES | 1-7 or SUN-SAT | , - * ? / L # |
Year | NO | empty, 1970-2099 | , - * / |
* (“所有值”) - 例如, “*” 在分钟字段中表示每分钟。
? (“没有指定值”) - 有用的,当你需要指定一些东西在两个字段中,其中一个字段中被允许,而另一个字段不被允许。例如:你想要我的Trigger在一个月中的特殊天(例如:第10天)被触发,但是不关心这天是周几,那么我将放10在day-of-month字段并且放“?”在day-of-week 字段。
- - 用于指定范围. 例如, “10-12” 在hour字段表示10,11,12点。
, - 用于指定附加的值。例如, “MON,WED,FRI” 在 day-of-week字段表示 “周一、周二和周五”.
/ -用于指定增量.例如, “0/15”在 seconds字段表示 “0, 15, 30, 和45秒”.。 ‘1/3’ 在day-of-month 字段表示 “每隔三天触发一次从月初1号开始”。
L (“last”) - 在允许的两个字段中有不同的含义。例如, “L”在day-of-month字段表示“月的最后一天” - 1月的31号, 非瑞年的2月28号。如果用在 day-of-week 字段, 它仅仅表示“7” 或“SAT”。但是用在day-of-week 中的另一个值后面, 它表示 “这个月的倒数第 xxx 天”- 例如 “6L” 表示 “这个月的最后一个星期五”.。你也可以指定一个到这个月末的偏移量, 例如 “L-3” 表示这个月的倒数第三天。 当使用“L”选项时,最重要的是不要指定列表,或范围的值,否则你会得到一个令人困惑的或者说非期望的值。
W (“weekday”) - 用于指定一个最接近指定日期的工作日(周一到周五). 举个例子,如果你指定 “15W” 作为day-of-month 字段的值, t意思就是说: “离15号的最接近的工作日”。 如果15th 是星期六,Trigger将会在14号-周五被触发。如果15th是一个星期天,trigger 将在16号被触发。如果15号是周二,Trigger将在15号被触发.。然而如果你指定“1W” 作为 day-of-month的值, 并且1号是一个周六, trigger将在3号周一被触发,因为它不会跳过一个月的范围。 ‘W’ 字符可以被使用仅仅当 day-of-month是单独的一天, 不是一个范围或着列表。
一些简单有用的例子:
“0 0/5 * * * ?” | 每隔5分钟触发一次 |
“10 0/5 * * * ?” | 每隔5分钟执行一次,时间秒数是10,例如:10:00:10 和10:05:10等 |
“0 30 10-13 ? * WED,FRI” | 周三周五的10:30、 11:30、12:30、13:30触发 |
“0 0/30 8-9 5,20 * ?” | 每个月20号的8:00到9:00之间每隔30分钟触发一次 |
- Trigger trigger = TriggerBuilder.newTrigger()
- .withIdentity("trigger3", "group1")
- .withSchedule(CronScheduleBuilder.cronSchedule("0 0/2 8-17 * * ?"))
- .forJob("myJob", "group1")
- .build();
CronTrigger的 Misfire Instruction常量:
- MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY
- MISFIRE_INSTRUCTION_DO_NOTHING
- MISFIRE_INSTRUCTION_FIRE_NOW
- trigger = newTrigger()
- .withIdentity("trigger3", "group1")
- .withSchedule(cronSchedule("0 0/2 8-17 * * ?")
- ..withMisfireHandlingInstructionFireAndProceed())
- .forJob("myJob", "group1")
- .build();