Quartz中共包含有4种触发器。并发
经常使用的是: SimpleTrigger
和 CronTrigger
。
不经常使用的是:CalendarIntervalTrigger
和 DailyTimeIntervalTrigger
。虽而后面两种用到的不是特别多,可是在特定的场景下,也是有不可替代的做用(具体看下官方文档)。ide
CalendarIntervalTrigger
: 根据一个给定的日历时间进行重复,能够设置启动时间。它能够完成 SimpleTrigger(好比每月,由于月不是一个肯定的秒数)和CronTrigger(好比5个月,由于5个月并非12个月的公约数)不能完成的一些任务。注意,使用month做为周期单位时,若是起始日期是在某月的最后一天,好比1月31日,那么下一个激活日在2月28日,之后全部的激活日都在当月的28日。若是你要严格限制在每个月的最后一天激活,那你须要使用cronTrigger。不受夏令时引发的时钟偏移影响。ui
DailyTimeIntervalTrigger
:在给定的时间窗口或指定的星期以秒、分钟、小时为周期进行重复。好比,天天早上8:00到11:00之间,每隔72分钟激活;或者每周的周一到周五9:20到16:47之间,每隔23分钟激活。this
SimpleTrigger的属性包括:开始时间、结束时间、重复次数以及重复的间隔。code
重复次数,能够是0、正整数,以及常量SimpleTrigger.REPEAT_INDEFINITELY。重复的间隔,必须是0,或者long型的正数,表示毫秒。注意,若是重复间隔为0,trigger将会以重复次数并发执行(或者以scheduler能够处理的近似并发数)。ci
指定时间开始触发,不重复文档
SimpleTrigger trigger = (SimpleTrigger) newTrigger() .withIdentity("trigger1", "group1") .startAt(myStartTime) // some Date .forJob("job1", "group1") // identify job with name, group strings .build();
指定时间触发,每隔10秒执行一次,重复10次get
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();
当即触发,每一个5分钟执行一次,直到22:00:string
trigger = newTrigger() .withIdentity("trigger7", "group1") .withSchedule(simpleSchedule() .withIntervalInMinutes(5) .repeatForever()) .endAt(dateOf(22, 0, 0)) .build();
创建一个触发器,将在下一个小时的整点触发,而后每2小时重复一次:it
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);
创建一个触发器,将在下一个小时的整点触发,而后每2小时重复一次
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);
CronTrigger
一般比 Simple Trigger
更有用,若是须要基于日历的概念而不是按照 SimpleTrigger
的精确指定间隔进行从新启动的做业启动计划。
使用 CronTrigger
,能够指定号时间表,例如“每周五中午”或“每一个工做日和上午9:30”,甚至“每周一至周五上午9:00至10点之间每5分钟”和1月份的星期五“。
即便如此,和 SimpleTrigger
同样,CronTrigger
有一个 startTime
,它指定什么时候生效,以及一个(可选的)endTime
,用于指定什么时候中止计划。
创建一个触发器,每隔一分钟,天天上午8点至下午5点之间
trigger = newTrigger() .withIdentity("trigger3", "group1") .withSchedule(cronSchedule("0 0/2 8-17 * * ?")) .forJob("myJob", "group1") .build();
创建一个触发器,将在天天上午10:42执行
// 第一种实现方式 trigger = newTrigger() .withIdentity("trigger3", "group1") .withSchedule(dailyAtHourAndMinute(10, 42)) .forJob(myJobKey) .build(); // 第二种实现方式 trigger = newTrigger() .withIdentity("trigger3", "group1") .withSchedule(cronSchedule("0 42 10 * * ?")) .forJob(myJobKey) .build();
创建一个触发器,将在星期三上午10:42在TimeZone(系统默认值)以外执行
// 第一种方式 trigger = newTrigger() .withIdentity("trigger3", "group1") .withSchedule(weeklyOnDayAndHourAndMinute(DateBuilder.WEDNESDAY, 10, 42)) .forJob(myJobKey) .inTimeZone(TimeZone.getTimeZone("America/Los_Angeles")) .build(); // 第二种方式 trigger = newTrigger() .withIdentity("trigger3", "group1") .withSchedule(cronSchedule("0 42 10 ? * WED")) .inTimeZone(TimeZone.getTimeZone("America/Los_Angeles")) .forJob(myJobKey) .build();