JavaEE進(jìn)階知識(shí)學(xué)習(xí)-----定時(shí)任務(wù)調(diào)度Quartz-2-觸發(fā)器Trigger

認(rèn)識(shí)Trigger

Quartz中的觸發(fā)器是用來(lái)告訴調(diào)度程序作業(yè)什么時(shí)候觸發(fā)呈宇,即Trigger對(duì)象是用來(lái)觸發(fā)執(zhí)行Job的。

觸發(fā)器的通用屬性

JobKey:表示job實(shí)例的標(biāo)識(shí)笛洛,觸發(fā)器被觸發(fā)時(shí),該指定的job實(shí)例會(huì)執(zhí)行纷跛。
StartTime:表示觸發(fā)器的時(shí)間表首次觸發(fā)的時(shí)間扫夜,值為util.Date。
EndTime:指定觸發(fā)器的不再被觸發(fā)的時(shí)間炮捧,值為util.Date庶诡。
實(shí)例如下
HelloScheduler類中的startAt(date)和endAt(endDate)

public class HelloScheduler {
    public static void main(String[] args) throws SchedulerException {
        //打印當(dāng)前時(shí)間
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("當(dāng)前時(shí)間為:"+sf.format(date));
        // 創(chuàng)建一個(gè)JobDetail實(shí)例,將實(shí)例與HelloJob綁定
        JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
                .withIdentity("myJob", "ground1")
                .build();
        //獲取距離當(dāng)前時(shí)間3秒后的時(shí)間
        date.setTime(date.getTime()+3000);
        //獲取距離當(dāng)前時(shí)間6秒后的時(shí)間
        Date endDate = new Date();
        endDate.setTime(endDate.getTime()+6000);
        // 創(chuàng)建一個(gè)Trigger實(shí)例咆课,定義該Job立即執(zhí)行末誓,并且每隔兩秒鐘重復(fù)執(zhí)行一次
        Trigger trigger = TriggerBuilder
                .newTrigger()
                .withIdentity("myTrigger", "group1")
                .startAt(date)//開始執(zhí)行時(shí)間為當(dāng)前時(shí)間的后3秒
                .endAt(endDate)//停止執(zhí)行的時(shí)間為當(dāng)前時(shí)間的后6秒
                .withSchedule(
                        SimpleScheduleBuilder.simpleSchedule()
                                .withIntervalInSeconds(2).repeatForever())
                .build();
        //創(chuàng)建Schedule實(shí)例
        SchedulerFactory sFactory = new StdSchedulerFactory();
        Scheduler scheduler = sFactory.getScheduler();
        scheduler.start();
        scheduler.scheduleJob(jobDetail,trigger);
    }

}

HelloJob中獲取了開始執(zhí)行時(shí)間和結(jié)束執(zhí)行時(shí)間扯俱。

public class HelloJob implements Job{

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        //打印當(dāng)前的執(zhí)行時(shí)間
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("當(dāng)前時(shí)間為:"+sf.format(date));
        Trigger currentTrigger = context.getTrigger();
        System.out.println("開始時(shí)間為:"+currentTrigger.getStartTime());
        System.out.println("結(jié)束時(shí)間為:"+currentTrigger.getEndTime());
        JobKey  jobKey = currentTrigger.getJobKey();
        System.out.println("jobKeyName:"+jobKey.getName()+"jobGroup:"+jobKey.getGroup());
        
    }

}

認(rèn)識(shí)SimpleTrigger

在一個(gè)指定時(shí)間段內(nèi)執(zhí)行一次作業(yè)任務(wù),或是在指定的時(shí)間間隔內(nèi)多次執(zhí)行作業(yè)任務(wù)喇澡。
實(shí)例一:距離當(dāng)前時(shí)間4秒后執(zhí)行且執(zhí)行一次

public class HelloJob implements Job{

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        //打印當(dāng)前的執(zhí)行時(shí)間
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("當(dāng)前時(shí)間為:"+sf.format(date));
        System.out.println("Hello world");
    }

}

HelloScheduler類中代碼如下

public class HelloScheduler {
    public static void main(String[] args) throws SchedulerException {
        //打印當(dāng)前時(shí)間
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("當(dāng)前時(shí)間為:"+sf.format(date));
        // 創(chuàng)建一個(gè)JobDetail實(shí)例迅栅,將實(shí)例與HelloJob綁定
        JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
                .withIdentity("myJob", "ground1")
                .build();
        
        //距離當(dāng)前時(shí)間4秒后執(zhí)行且執(zhí)行一次
        date.setTime(date.getTime()+4000);
        SimpleTrigger trigger = (SimpleTrigger)TriggerBuilder
                .newTrigger()
                .withIdentity("myTrigger", "group1")
                .startAt(date)
                .build();
        //創(chuàng)建Schedule實(shí)例
        SchedulerFactory sFactory = new StdSchedulerFactory();
        Scheduler scheduler = sFactory.getScheduler();
        scheduler.start();
        scheduler.scheduleJob(jobDetail,trigger);
    }

}

實(shí)例二:距距離當(dāng)前時(shí)間4秒后首次執(zhí)行任務(wù)之后每隔兩秒重復(fù)執(zhí)行一次,在第一次執(zhí)行再連續(xù)執(zhí)行三次

public class HelloScheduler {
    public static void main(String[] args) throws SchedulerException {
        //打印當(dāng)前時(shí)間
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("當(dāng)前時(shí)間為:" + sf.format(date));
        // 創(chuàng)建一個(gè)JobDetail實(shí)例晴玖,將實(shí)例與HelloJob綁定
        JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
                .withIdentity("myJob", "ground1").build();

        // 距距離當(dāng)前時(shí)間4秒后首次執(zhí)行任務(wù)之后每隔兩秒重復(fù)執(zhí)行一次读存,在第一次執(zhí)行再連續(xù)執(zhí)行三次
        date.setTime(date.getTime() + 4000);
        SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder
                .newTrigger()
                .withIdentity("myTrigger", "group1")
                .startAt(date)
                .withSchedule(
                        SimpleScheduleBuilder
                                .simpleSchedule()
                                .withIntervalInSeconds(2)
                                .withRepeatCount(3))
                .build();
        // 創(chuàng)建Schedule實(shí)例
        SchedulerFactory sFactory = new StdSchedulerFactory();
        Scheduler scheduler = sFactory.getScheduler();
        scheduler.start();
        scheduler.scheduleJob(jobDetail, trigger);
    }

}

實(shí)例三:距離當(dāng)前時(shí)間4秒后首次執(zhí)行,距離當(dāng)前時(shí)間后6秒停止執(zhí)行

public class HelloScheduler {
    public static void main(String[] args) throws SchedulerException {
        //打印當(dāng)前時(shí)間
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("當(dāng)前時(shí)間為:" + sf.format(date));
        // 創(chuàng)建一個(gè)JobDetail實(shí)例呕屎,將實(shí)例與HelloJob綁定
        JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
                .withIdentity("myJob", "ground1").build();

        // 距離當(dāng)前時(shí)間4秒后首次執(zhí)行让簿,距離當(dāng)前時(shí)間后6秒停止執(zhí)行
        date.setTime(date.getTime() + 4000);
        Date endDate = new Date();
        endDate.setTime(endDate.getTime()+6000);
        SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder
                .newTrigger()
                .withIdentity("myTrigger", "group1")
                .startAt(date)
                .endAt(endDate)
                .withSchedule(
                        SimpleScheduleBuilder
                                .simpleSchedule()
                                .withIntervalInSeconds(2)
                                .withRepeatCount(3))
                .build();
        // 創(chuàng)建Schedule實(shí)例
        SchedulerFactory sFactory = new StdSchedulerFactory();
        Scheduler scheduler = sFactory.getScheduler();
        scheduler.start();
        scheduler.scheduleJob(jobDetail, trigger);
    }

}

注意

重復(fù)次數(shù)withRepeatCount:可以是0,正整數(shù)或是SimpleTrigger.REPEAT_INDEFINITELY常量值
重復(fù)執(zhí)行間隔withIntervalInSeconds:必須為0或者長(zhǎng)整數(shù)
指定了endAt參數(shù)秀睛,就會(huì)覆蓋重復(fù)執(zhí)行的效果

認(rèn)識(shí)CronTrigger

基于日歷的作業(yè)調(diào)度器尔当,而不是像SimpleTrigger那樣精確的指定時(shí)間間隔,比SimpleTrigger更常用蹂安。

Cron表達(dá)式

用于配置CronTrigger實(shí)例椭迎,是由7個(gè)子表達(dá)式組成的字符串,描述了時(shí)間表的詳細(xì)信息田盈,格式為:
[秒] [分] [小時(shí)] [日] [月] [周] [年]
實(shí)例一:使用CronTrigger 每秒鐘觸發(fā)一次任務(wù)

public class HelloScheduler {
    public static void main(String[] args) throws SchedulerException {
        //打印當(dāng)前時(shí)間
        Date date = new Date();
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("當(dāng)前時(shí)間為:" + sf.format(date));
        // 創(chuàng)建一個(gè)JobDetail實(shí)例畜号,將實(shí)例與HelloJob綁定
        JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
                .withIdentity("myJob").build();
        // 每秒執(zhí)行一次任務(wù)
        CronTrigger trigger = (CronTrigger) TriggerBuilder
                .newTrigger()
                .withIdentity("myTrigger", "group1")
                .withSchedule(
                        CronScheduleBuilder.cronSchedule("* * * * * ? *"))
                .build();
        // 創(chuàng)建Schedule實(shí)例
        SchedulerFactory sFactory = new StdSchedulerFactory();
        Scheduler scheduler = sFactory.getScheduler();
        scheduler.start();
        scheduler.scheduleJob(jobDetail, trigger);
    }

}

注意,表達(dá)式中的空格和英文狀態(tài)

Cron表達(dá)式特殊字符意義對(duì)應(yīng)表

image

Cron表達(dá)式舉例

image

實(shí)例:

2017年內(nèi)的每天10點(diǎn)15分觸發(fā)一次

0 15 10 允瞧? * * 2017

每天的14點(diǎn)整至14點(diǎn)59分55秒弄兜,以及18點(diǎn)整至18點(diǎn)59分55秒,每5秒鐘觸發(fā)一次

0/5 * 14,18 * * ?

通配符說(shuō)明

image

Cron表達(dá)式

  • L和W可以一起使用瓷式,例如LW表示每個(gè)月的最后一個(gè)工作日
  • 周字段英文字母不區(qū)分大小寫
  • 利用工具替饿,在線生成百度搜索Crona表達(dá)式在線生成器

Scheduler-工廠模式

所有的Schedule實(shí)例應(yīng)該有SchedulerFactory來(lái)創(chuàng)建,Quartz的三個(gè)核心概念是調(diào)度器贸典,任務(wù)和觸發(fā)器
關(guān)系如下:


image

Scheduler創(chuàng)建方式

SchedulerFactory sFactory = new StdSchedulerFactory();
Scheduler scheduler = sFactory.getScheduler();

DirectSchedulerFactory factory = DirectSchedulerFactory.getInstance();
Scheduler scheduler2 = factory.getScheduler();

StdSchedulerFactory

  1. 使用一組參數(shù)(Java.util.Properties)來(lái)創(chuàng)建和初始化Quartz調(diào)度器视卢。
  2. 配置參數(shù)一般存儲(chǔ)在quartz.properties中。
  3. 調(diào)用getScheduler方法就能創(chuàng)建和初始化調(diào)度器對(duì)象廊驼。

未完据过,待續(xù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市妒挎,隨后出現(xiàn)的幾起案子绳锅,更是在濱河造成了極大的恐慌,老刑警劉巖酝掩,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鳞芙,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)原朝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門驯嘱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人喳坠,你說(shuō)我怎么就攤上這事鞠评。” “怎么了壕鹉?”我有些...
    開封第一講書人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵剃幌,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我晾浴,道長(zhǎng)锥忿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任怠肋,我火速辦了婚禮,結(jié)果婚禮上淹朋,老公的妹妹穿的比我還像新娘笙各。我一直安慰自己,他們只是感情好础芍,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開白布杈抢。 她就那樣靜靜地躺著,像睡著了一般仑性。 火紅的嫁衣襯著肌膚如雪惶楼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,698評(píng)論 1 305
  • 那天诊杆,我揣著相機(jī)與錄音歼捐,去河邊找鬼。 笑死晨汹,一個(gè)胖子當(dāng)著我的面吹牛豹储,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播淘这,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼剥扣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了铝穷?” 一聲冷哼從身側(cè)響起钠怯,我...
    開封第一講書人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎曙聂,沒(méi)想到半個(gè)月后晦炊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年刽锤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了镊尺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡并思,死狀恐怖庐氮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情宋彼,我是刑警寧澤弄砍,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站输涕,受9級(jí)特大地震影響音婶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜莱坎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一衣式、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧檐什,春花似錦碴卧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至瓮具,卻和暖如春荧飞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背名党。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工叹阔, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人传睹。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓条获,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蒋歌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子帅掘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容