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();