1. 程式人生 > >淺談Trigger(SimpleTrigger&CronTrigger)

淺談Trigger(SimpleTrigger&CronTrigger)

simple 時也 單位 except 生成 ini ide Go out

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

淺談Trigger(SimpleTrigger&CronTrigger)