job任務類:
package org.quartz.examples.example14; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; /** * 一個簡單的job任務 */ public class TriggerEchoJob implements Job { private static final Logger LOG = LoggerFactory.getLogger(TriggerEchoJob.class); // 必須要有public修飾的無參構造函數 public TriggerEchoJob() { } // 任務執行方法 public void execute(JobExecutionContext context) throws JobExecutionException { LOG.info("任務執行。TRIGGER: " + context.getTrigger().getKey()); } }
調度器類:
package org.quartz.examples.example14; import static org.quartz.DateBuilder.futureDate; import static org.quartz.JobBuilder.newJob; import static org.quartz.SimpleScheduleBuilder.simpleSchedule; import static org.quartz.TriggerBuilder.newTrigger; import org.quartz.DateBuilder.IntervalUnit; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerFactory; import org.quartz.Trigger; import org.quartz.impl.StdSchedulerFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Date; /** * 這個例子將演示觸發器是如何按優先級排序的。 */ public class PriorityExample { Logger LOG = LoggerFactory.getLogger(PriorityExample.class); public void run() throws Exception { // 初始化調度器 // SchedulerFactory sf = new StdSchedulerFactory("org/quartz/examples/example14/quartz_priority.properties"); SchedulerFactory sf = new StdSchedulerFactory(); Scheduler sched = sf.getScheduler(); JobDetail job = newJob(TriggerEchoJob.class).withIdentity("TriggerEchoJob").build(); // 這三個觸發器將同時觸發它們的第一次,按優先級排序,優先級數字越大,優先級越高。 // 然后重復執行一次,因為間隔時間秒數不一樣,所以觸發器又會顯示好像不按優先級順序觸發了,其實並沒有忽略優先級。 // 由於設置了觸發器優先級,所以我們應該可以看到以下觸發器執行順序: // 1. Priority10Trigger15SecondRepeat // 2. Priority5Trigger10SecondRepeat // 3. Priority1Trigger5SecondRepeat // 4. Priority1Trigger5SecondRepeat // 5. Priority5Trigger10SecondRepeat // 6. Priority10Trigger15SecondRepeat // Calculate the start time of all triggers as 5 seconds from now Date startTime = futureDate(5, IntervalUnit.SECOND); // 第一個觸發器優先級1(withPriority),優先級數字越小觸發器優先級越低 Trigger trigger1 = newTrigger().withIdentity("Priority1Trigger5SecondRepeat").startAt(startTime) .withSchedule(simpleSchedule().withRepeatCount(1).withIntervalInSeconds(5)).withPriority(1).forJob(job) .build(); // 第二個觸發器優先級未設置,默認優先執行設置了優先級的觸發器,所以這個觸發器優先級最低 Trigger trigger2 = newTrigger().withIdentity("Priority5Trigger10SecondRepeat").startAt(startTime) .withSchedule(simpleSchedule().withRepeatCount(1).withIntervalInSeconds(10)).forJob(job).build(); // 觸發器優先級10(withPriority),優先級數字越大觸發器優先級越高,在觸發器並發執行情況下,優先級越高的觸發器執行越靠前 Trigger trigger3 = newTrigger().withIdentity("Priority10Trigger15SecondRepeat").startAt(startTime) .withSchedule(simpleSchedule().withRepeatCount(1).withIntervalInSeconds(15)).withPriority(10) .forJob(job).build(); sched.scheduleJob(job, trigger1); sched.scheduleJob(trigger2); sched.scheduleJob(trigger3); //啟動調度器,只有啟動調度器,觸發器和任務才會真正執行 sched.start(); LOG.info("------- Started Scheduler -----------------"); Thread.sleep(30L * 1000L); //關閉調度器 sched.shutdown(true); LOG.info("------- Shutdown Complete -----------------"); } public static void main(String[] args) throws Exception { PriorityExample example = new PriorityExample(); example.run(); } }