淺談Trigger(SimpleTrigger&CronTrigger)


 1.Trigger是什么

  Quartz中的觸發器用來告訴調度程序作業什么時候觸發,即Trigger對象是用來觸發執行job的。

 2.Quartz中的Trigger

 

 3.觸發器通用屬性:

JobKey:表示job實例的標識,觸發器被觸發時,該指定的job實例會執行

StartTime:表示觸發器的時間表 首次被觸發的時間,值類型是Java.util.Date

EndTime:指定觸發器的不再觸發的時間,它的值類型是Java.util.Date

 

例如:通過Trigger設置開始時間,結束時間以及在Job中通過trigger獲取job標識與trigger的開始時間與結束時間

HelloJob.java(通過trigger獲取job標識與trigger的開始時間與結束時間)

package cn.qlq.quartz;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.quartz.Trigger;
import org.quartz.TriggerKey;

public class HelloJob implements Job {
    

    public void execute(JobExecutionContext context) throws JobExecutionException {
        //打印當前的時間
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        // 1.獲取Trigger
        Trigger trigger = context.getTrigger();
        //2.通過trigger獲取job標識
        JobKey jobKey = trigger.getJobKey();
        System.out.println("Job's key:"+"name:"+jobKey.getName()+"\tgroup:"+jobKey.getGroup());getClass();
        System.out.println("Start time : "+sf.format(trigger.getStartTime()));
        System.out.println("End time : "+sf.format(trigger.getEndTime()));
        
    }
    
}

 

 

 

HelloScheduler.java(用Trigger設置開始時間,結束時間)

package cn.qlq.quartz;

import static org.quartz.DateBuilder.newDate;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.TriggerBuilder.newTrigger;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;

import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.calendar.AnnualCalendar;

public class HelloScheduler {
    public static void main(String[] args) {
        try {
            //1. 創建一個JodDetail實例 將該實例與Hello job class綁定    (鏈式寫法)
            JobDetail jobDetail = newJob(HelloJob.class) // 定義Job類為HelloQuartz類,這是真正的執行邏輯所在
                    .withIdentity("myJob") // 定義name/group
                    .build();

            //2. 定義一個Trigger,定義該job立即執行,並且每兩秒鍾執行一次,直到永遠
            //2.1設置Trigger的開始時間(3s后開始)
            Date startTime = new Date();
            startTime.setTime(startTime.getTime()+3000);
            //2.2設置Trigger的結束時間(6s后開始)
            Date endTime = new Date();
            endTime.setTime(endTime.getTime()+6000);
            Trigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1")// 定義名字和組
                    .startAt(startTime)
                    .endAt(endTime)
                    .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2).repeatForever())
                    .build();
            
            //3. 創建scheduler
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

            //4. 將trigger和jobdetail加入這個調度
            scheduler.scheduleJob(jobDetail, trigger);

            //5. 啟動scheduler
            scheduler.start();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

 

 

結果:

Job's key:name:myJob    group:DEFAULT
Start time : 2018-04-04 10:43:54
End time : 2018-04-04 10:43:57 Job's key:name:myJob group:DEFAULT Start time : 2018-04-04 10:43:54 End time : 2018-04-04 10:43:57

 

---------------------------淺談SimpleTrigger----------------------

 

SimpleTrigger的作用

  在一個指定時間段內執行一次作業任務或是在指定時間間隔內執行多次作業任務

 

 例一:4秒鍾后執行任務並且只執行一次

HelloJob.java
package cn.qlq.quartz;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class HelloJob implements Job {
    

    public void execute(JobExecutionContext context) throws JobExecutionException {
        //打印當前的時間
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        Date date = new Date();
        System.out.println("current exec time is :"+sf.format(date));
    }
    
}

 

 

 

 HelloScheduler.java

package cn.qlq.quartz;

import static org.quartz.JobBuilder.newJob;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class HelloScheduler {
    public static void main(String[] args) {
        try {
            // 1. 創建一個JodDetail實例 將該實例與Hello job class綁定 (鏈式寫法)
            JobDetail jobDetail = newJob(HelloJob.class) // 定義Job類為HelloQuartz類,這是真正的執行邏輯所在
                    .withIdentity("myJob") // 定義name/group
                    .build();
            // 打印當前的時間
            SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            Date date = new Date();
            System.out.println("current time is :" + sf.format(date));

            // 2. 定義一個Trigger,定義該job在4秒后執行,並且執行一次
            Date startTime = new Date();
            startTime.setTime(startTime.getTime()+4000L);
            SimpleTrigger trigger = (SimpleTrigger)TriggerBuilder.newTrigger()
                    .withIdentity("myTrigger", "group1")// 定義名字和組
                    .startAt(startTime)
                    .build();

            // 3. 創建scheduler
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

            // 4. 將trigger和jobdetail加入這個調度
            scheduler.scheduleJob(jobDetail, trigger);

            // 5. 啟動scheduler
            scheduler.start();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

 

 

結果:

current time is :2018-04-05 10:16:33
current exec time is :2018-04-05 10:16:37

 

 例二:一個jobjob在4秒后首次執行,並且每隔兩秒執行一次,重復執行無數次

 

修改上面的HelloScheduler中Trigger的定義

            // 2. 定義一個Trigger,定義該job在4秒后首次執行,並且每隔兩秒執行一次
            Date startTime = new Date();
            startTime.setTime(startTime.getTime() + 4000L);
            SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger()
                    .withIdentity("myTrigger", "group1")// 定義名字和組
                    .startAt(startTime)//定義開始時間
                    .withSchedule(    //定義任務調度的時間間隔和次數
                            SimpleScheduleBuilder
                            .simpleSchedule()
                            .withIntervalInSeconds(2)//定義時間間隔是2秒
                            .withRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY)//定義重復執行次數是無限次
                            )
                    .build();

 

 

 

 例三:一個jobjob在4秒后首次執行,並且每隔兩秒執行一次,重復執行3次

 修改上面的HelloScheduler中Trigger的定義

            // 2. 定義一個Trigger,定義該job在4秒后首次執行,並且每隔兩秒執行一次,重復3次
            Date startTime = new Date();
            startTime.setTime(startTime.getTime() + 4000L);
            SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger()
                    .withIdentity("myTrigger", "group1")// 定義名字和組
                    .startAt(startTime)//定義開始時間
                    .withSchedule(    //定義任務調度的時間間隔和次數
                            SimpleScheduleBuilder
                            .simpleSchedule()
                            .withIntervalInSeconds(2)//定義時間間隔是2秒
                            .withRepeatCount(3)//定義重復執行次數是無限次
                            )
                    .build();

 

 

 結果:

current time is :2018-04-05 10:27:40
current exec time is :2018-04-05 10:27:44
current exec time is :2018-04-05 10:27:46
current exec time is :2018-04-05 10:27:48
current exec time is :2018-04-05 10:27:50

 

 例四:定義開始時間在4s后,結束時間在6s后,同時也定義每隔兩秒執行一次,重復執行3次

  修改上面的HelloScheduler中Trigger的定義

            // 2. 定義一個Trigger,定義該job在4秒后執行,6s后停止
            //2.1設置開始時間為4s后
            Date startTime = new Date();
            startTime.setTime(startTime.getTime() + 4000L);
            //2.2設置結束時間為6s后
            Date endTime = new Date();
            endTime.setTime(endTime.getTime() + 6000L);
            SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger()
                    .withIdentity("myTrigger", "group1")// 定義名字和組
                    .startAt(startTime)//定義開始時間為4s后
                    .endAt(endTime)//定義結束時間為6s后
                    .withSchedule(    //定義任務調度的時間間隔和次數
                            SimpleScheduleBuilder
                            .simpleSchedule()
                            .withIntervalInSeconds(2)//定義時間間隔是2秒
                            .withRepeatCount(3)//定義重復執行次數是無限次
                            )
                    .build();

 

 

 結果:

current time is :2018-04-05 10:34:46
current exec time is :2018-04-05 10:34:50

 

  表明endAt()的優先級高級后面定義的頻度。也就是如果定義了結束時間,會在指定時間結束。

 

SimpleTrigger總結:

  1.重復次數可以是0,正整數或是SimpleTrigger.REPEAT_INDEFINITELY常量值。我們點擊發現REPEAT_INDEFINITELY是-1,也就是-1表示無線次。

  2.重復執行時間間隔必須為0或長整數。可以用小時,分鍾,秒數的單位限制間隔

  3.一旦指定了endTime參數,那么它會覆蓋重復次數參數的效果。

 

 

-----------------------------淺談CronTrigger---------------------------------

0.CronTrigger的作用

 基於日歷的作業調度器,而不是像SimpleTrigger那樣精確指定間隔時間,比SimpleTrigger更常用

 

1.Cron表達式

用於配置CronTrigger實例

是由7個子表達式組成的字符串,描述了時間表的詳細信息

格式:[秒][分][小時][日][月][周][年]

書寫規則:知道確定日期的寫上,不知道的用*代替  (年可以省略,只寫前6個) 

2.Cron表達式特殊字符意義對應表

特殊符號解釋

 

Cron表達式舉例

 

 Cron表達式小提示

L和W可以一組合使用 周字段英文字母不區分大小寫即MON與mon相同 利用工具,在線生成  http://cron.qqe2.com/

 

3.例子:

HelloJob.java

package cn.qlq.quartz;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class HelloJob implements Job {
    

    public void execute(JobExecutionContext context) throws JobExecutionException {
        //打印當前的時間
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        Date date = new Date();
        System.out.println("current exec time is :"+sf.format(date));
    }
    
}

 

 

 

 例一:每秒鍾都執行上面job,重復無數次

HelloScheduler.java

package cn.qlq.quartz;

import static org.quartz.JobBuilder.newJob;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class HelloScheduler {
    public static void main(String[] args) {
        try {
            // 1. 創建一個JodDetail實例 將該實例與Hello job class綁定 (鏈式寫法)
            JobDetail jobDetail = newJob(HelloJob.class) // 定義Job類為HelloQuartz類,這是真正的執行邏輯所在
                    .withIdentity("myJob") // 定義name/group
                    .build();
            // 打印當前的時間
            SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            Date date = new Date();
            System.out.println("current time is :" + sf.format(date));

            // 2. 定義一個Trigger,定義該job立即執行,並且每秒都執行一次。重復無數次
            CronTrigger trigger = (CronTrigger) TriggerBuilder.newTrigger()
                    .withIdentity("myTrigger", "group1")// 定義名字和組
                    .withSchedule(    //定義任務調度的時間間隔和次數
                            CronScheduleBuilder
                            .cronSchedule("* * * * * ? *")
                            )
                    .build();

            // 3. 創建scheduler
            SchedulerFactory sfact = new StdSchedulerFactory();
            Scheduler scheduler = sfact.getScheduler();

            // 4. 將trigger和jobdetail加入這個調度
            scheduler.scheduleJob(jobDetail, trigger);

            // 5. 啟動scheduler
            scheduler.start();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

 

 結果:

current time is :2018-04-05 10:56:37
current exec time is :2018-04-05 10:56:37
current exec time is :2018-04-05 10:56:38
current exec time is :2018-04-05 10:56:39
current exec time is :2018-04-05 10:56:40

 .....

 

 例二:2018年內每天11點18開始執行,每隔5s執行一次

修改上面HelloScheduler中的Trigger:

            // 2. 2018年內每天11點18開始執行,每隔5s執行一次
            CronTrigger trigger = (CronTrigger) TriggerBuilder.newTrigger()
                    .withIdentity("myTrigger", "group1")// 定義名字和組
                    .withSchedule(    //定義任務調度的時間間隔和次數
                            CronScheduleBuilder
                            .cronSchedule("0/5 18 11 ? * * 2018")
                            )
                    .build();

 

 

 

 例三:每天的14點整至14點59分55秒,以及18點整至18點59分55秒,每5秒鍾執行一次

            CronTrigger trigger = (CronTrigger) TriggerBuilder.newTrigger()
                    .withIdentity("myTrigger", "group1")// 定義名字和組
                    .withSchedule(    //定義任務調度的時間間隔和次數
                            CronScheduleBuilder
                            .cronSchedule("0/5 0 14,18 * * ? *")
                            )
                    .build();

 


免責聲明!

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



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