quartz2.3.0(十四)trigger觸發器優先級排序


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM