真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Quartz中Trigger的作用是什么

本篇文章給大家分享的是有關(guān)Quartz 中Trigger的作用是什么,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),洮北企業(yè)網(wǎng)站建設(shè),洮北品牌網(wǎng)站建設(shè),網(wǎng)站定制,洮北網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,洮北網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

Trigger的公共屬性

triggerKey:表示Trigger身份的屬性

jobKey:Trigger觸發(fā)時(shí)被執(zhí)行的Job的身份

startTime:Trigger第一次觸發(fā)的時(shí)間

endTime:Trigger失效的時(shí)間點(diǎn)

Trigger的其它屬性

優(yōu)先級(priority):如果Trigger很多,或者Quartz線程池的工作線程太少,Quartz可能沒有足夠的資源同事觸發(fā)所有的Trigger,這種情況下,如果希望某些Trigger優(yōu)先被觸發(fā),就需要給它設(shè)置優(yōu)先級,Trigger默認(rèn)的優(yōu)先級為5,優(yōu)先級priority屬性的值可以是任意整數(shù),正數(shù)、負(fù)數(shù)都可以。(只有同時(shí)觸發(fā)的Trigger之間才會(huì)比較優(yōu)先級)

錯(cuò)失觸發(fā)(misfire):如果Scheduler關(guān)閉了,或者Quartz線程池中沒有可用的線程來執(zhí)行Job,此時(shí)持久性的Trigger就會(huì)錯(cuò)過其觸發(fā)時(shí)間,即錯(cuò)失觸發(fā)。不同類型的Trigger,有不同的misfire機(jī)制,它們都默認(rèn)使用“智能機(jī)制(smart policy)”,即根據(jù)Trigger的類型和配置動(dòng)態(tài)調(diào)整行為,當(dāng)Scheduler啟動(dòng)的時(shí)候,查詢所有錯(cuò)過觸發(fā)機(jī)制的持久性Trigger,然后根據(jù)它們各自的misfire機(jī)制更新Trigger的信息。

日歷(Calendar)示例

Quartz的Calendar對象(不是java.util.Calendar對象)可以在定義和存儲(chǔ)trigger的時(shí)候與trigger進(jìn)行關(guān)聯(lián)。Calendar用于從trigger的調(diào)度計(jì)劃中排除時(shí)間段。

各種常用Trigger

SimpleTrigger

指定從某一個(gè)時(shí)間開始,以一定時(shí)間間隔(單位:毫秒)執(zhí)行的任務(wù)。

它的屬性有:

repeatInterval:重復(fù)間隔

repeatCount:重復(fù)次數(shù),實(shí)際執(zhí)行次數(shù)是repeatCount+1(因?yàn)樵趕tartTime的時(shí)候一定會(huì)執(zhí)行一次)

SimpleTrigger trigger = newTrigger()
       .withIdentity("trigger1", "group1")
       .startAt(futureDate(5, DateBuilder.IntervalUnit.SECOND))
       .withSchedule(simpleSchedule().withIntervalInSeconds(10).withRepeatCount(10))
       .endAt(dateOf(18, 0, 0))
       .forJob(job)
       .build();

注意:endTime屬性的值會(huì)覆蓋repeatCount的屬性值。

TriggerBuilder(以及Quartz的其他Builder)會(huì)為那些沒有被顯示設(shè)置的屬性選擇合理的默認(rèn)值,例如:如果沒有調(diào)用withIdentity(..)方法,TriggerBuilder會(huì)為trigger生成一個(gè)隨機(jī)的名稱;如果沒有調(diào)用startAt(..)方法,則默認(rèn)使用當(dāng)前時(shí)間,即trigger立即生效。

CalendarIntervalTrigger

類似于SimpleTrigger,指定從某一個(gè)時(shí)間開始,以一定的時(shí)間間隔執(zhí)行的任務(wù)。 但是不同的是SimpleTrigger指定的時(shí)間間隔為毫秒,沒辦法指定每隔一個(gè)月執(zhí)行一次(每月的時(shí)間間隔不是固定值),而CalendarIntervalTrigger支持的間隔單位有秒,分鐘,小時(shí),天,月,年,星期。

相較于SimpleTrigger有兩個(gè)優(yōu)勢:

1、更方便,比如每隔1小時(shí)執(zhí)行,你不用自己去計(jì)算1小時(shí)等于多少毫秒

2、支持不是固定長度的間隔,比如間隔為月和年。但劣勢是精度只能到秒

它的屬性有:

interval 執(zhí)行間隔

intervalUnit 執(zhí)行間隔的單位(秒,分鐘,小時(shí),天,月,年,星期)

CalendarIntervalTrigger trigger = newTrigger()
       .withIdentity("trigger1", "group1")
       .startNow()
       .withSchedule(calendarIntervalSchedule().withInterval(10, DateBuilder.IntervalUnit.SECOND))
       //.withSchedule(calendarIntervalSchedule().withIntervalInDays(1))
       .endAt(dateOf(18, 0, 0))
       .forJob(job)
       .build();

DailyTimeIntervalTrigger

指定每天的某個(gè)時(shí)間段內(nèi),以一定的時(shí)間間隔執(zhí)行任務(wù)。并且它可以支持指定星期。

它的屬性有:

startTimeOfDay 每天開始時(shí)間

endTimeOfDay 每天結(jié)束時(shí)間

daysOfWeek 需要執(zhí)行的星期

interval 執(zhí)行間隔

intervalUnit 執(zhí)行間隔的單位(秒,分鐘,小時(shí),天,月,年,星期)

repeatCount 重復(fù)次數(shù)

DailyTimeIntervalTrigger trigger = newTrigger()
       .withIdentity("trigger1", "group1")
       .startNow()
       .withSchedule(dailyTimeIntervalSchedule()
               .onDaysOfTheWeek(MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY) //周一至周五執(zhí)行
               .withInterval(10, DateBuilder.IntervalUnit.SECOND))
       .forJob(job)
       .build();

CronTrigger

適合于更復(fù)雜的任務(wù),它支持類型于Linux Cron的語法(并且更強(qiáng)大)。

CronTrigger trigger = newTrigger()
       .withIdentity("trigger1", "group1")
       .startNow()
       .withSchedule(cronSchedule("*/1 * * * * ?"))
       .forJob(job)
       .build();

注意:如果一些調(diào)度要求太復(fù)雜,無法用單一觸發(fā)表示,那么就應(yīng)該創(chuàng)建多個(gè)Trigger,Job和Trigger是松耦合的,一個(gè)Job可以定義多個(gè)Trigger。

public class HelloJob implements Job {
   @Override
   public void execute(JobExecutionContext context) throws JobExecutionException {
       try {
           JobDetail job = context.getJobDetail();
           String name = job.getJobDataMap().getString("name");
           Trigger trigger = context.getTrigger();
           System.out.println("Run By Trigger: " + trigger.getKey() + ", hello " + name + " at " + new Date());
       } catch (Exception e) {
           e.printStackTrace();
       }
   }
}
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

scheduler.start();

JobDetail job = newJob(HelloJob.class)
       .withIdentity("job1", "group1")
       .usingJobData("name", "quartz").build();

CronTrigger trigger1 = newTrigger()
       .withIdentity("trigger1", "group1")
       .startNow()
       .withSchedule(cronSchedule("*/5 * 9-12 * * ?"))
       .forJob(job)
       .build();

CronTrigger trigger2 = newTrigger()
       .withIdentity("trigger2", "group1")
       .startNow()
       .withSchedule(cronSchedule("0 */1 14-18 * * ?"))
       .forJob(job)
       .build();

Set triggerSet = new HashSet<>();
triggerSet.add(trigger1);
triggerSet.add(trigger2);
scheduler.scheduleJob(job, triggerSet, true);

try {
   Thread.sleep(1000L * 60L * 10L);
} catch (InterruptedException e) {
   e.printStackTrace();
}

scheduler.shutdown();

Misfire策略

MISFIRE_INSTRUCTION_SMART_POLICY:所有Trigger的MisFire默認(rèn)策略,即:把處理邏輯交給從Smart的Quartz去決定。

基本策略:

> 如果是只執(zhí)行一次的調(diào)度,使用MISFIRE_INSTRUCTION_FIRE_NOW

> 如果是無限次的調(diào)度(repeatCount是無限的),使用MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT

> 否則,使用MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT

MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY:忽略MisFire策略,在資源適合的時(shí)候,重新出發(fā)所有MisFire任務(wù),不影響現(xiàn)有的調(diào)度

SimpleTrigger Misfire策略

MISFIRE_INSTRUCTION_FIRE_NOW:忽略已經(jīng)MisFire的任務(wù),并且立即執(zhí)行調(diào)度,通常只適用于只執(zhí)行一次任務(wù)的場景

MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT:將startTime設(shè)置為當(dāng)前時(shí)間,立即重新調(diào)度任務(wù),包括MisFire的任務(wù)

MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT:與上一個(gè)策略類似,區(qū)別在于該策略會(huì)忽略MisFire的任務(wù)

MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_EXISTING_COUNT:在下一次調(diào)度的時(shí)間點(diǎn),重新開始調(diào)度任務(wù),包括MisFire的任務(wù)

MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT:與上一個(gè)策略類似,區(qū)別在于該策略會(huì)忽略MisFire的任務(wù)

CronTrigger Misfire策略

MISFIRE_INSTRUCTION_DO_NOTHING:什么都不做,繼續(xù)等下一次調(diào)度時(shí)間再觸發(fā)

MISFIRE_INSTRUCTION_FIRE_NOW:忽略已經(jīng)MisFire的任務(wù),并且立即執(zhí)行調(diào)度,通常只適用于只執(zhí)行一次任務(wù)的場景

Listeners

Listener用于在調(diào)度過程中監(jiān)聽事件操作,不過,大多數(shù)情況下,用戶并不會(huì)使用Listener。JobListener、TriggerListener、SchedulerListener的用法類似,無非就是addXXXListener()、removeXXXListener()的操作,下面以JobListener為例介紹:

創(chuàng)建一個(gè)自定義的JobListener:

public class MyJobListener implements JobListener {
   @Override
   public String getName() {
       System.out.println("getName()");
       return "getName()";
   }


   @Override
   public void jobToBeExecuted(JobExecutionContext jobExecutionContext) {
       System.out.println("jobToBeExecuted()");
   }

   @Override
   public void jobExecutionVetoed(JobExecutionContext jobExecutionContext) {
       System.out.println("jobExecutionVetoed()");
   }

   @Override
   public void jobWasExecuted(JobExecutionContext jobExecutionContext, JobExecutionException e) {
       System.out.println("jobWasExecuted()");
   }
}

使用JobListener:

public class JobListenerDemo {

   public static void main(String[] args) {
       try {
           Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

           MyJobListener myJobListener = new MyJobListener();

           //添加監(jiān)聽
           scheduler.getListenerManager().addJobListener(myJobListener, KeyMatcher.keyEquals(jobKey("job1", "group1")));
           //scheduler.getListenerManager().addJobListener(new MyJobListener(), GroupMatcher.groupEquals("group1"));

           //移除監(jiān)聽
           //scheduler.getListenerManager().removeJobListener(myJobListener.getName());

           scheduler.start();

           JobDetail job = newJob(HelloJob.class).withIdentity("job1", "group1")
                   .usingJobData("name", "quartz").build();

           Trigger trigger = newTrigger().withIdentity("trigger1", "group1").startNow()
                   .withSchedule(simpleSchedule().withIntervalInSeconds(1).repeatForever()).build();

           scheduler.scheduleJob(job, trigger);

           try {
               Thread.sleep(1000L * 60L * 10L);
           } catch (InterruptedException e) {
               e.printStackTrace();
           }

           scheduler.shutdown();
       } catch (SchedulerException e) {
           e.printStackTrace();
       }
   }
}

以上就是Quartz 中Trigger的作用是什么,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


網(wǎng)頁標(biāo)題:Quartz中Trigger的作用是什么
網(wǎng)址分享:http://weahome.cn/article/jhgidg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部