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

創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設,洮北企業(yè)網(wǎng)站建設,洮北品牌網(wǎng)站建設,網(wǎng)站定制,洮北網(wǎng)站建設報價,網(wǎng)絡營銷,網(wǎng)絡優(yōu)化,洮北網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
Trigger的公共屬性
triggerKey:表示Trigger身份的屬性
jobKey:Trigger觸發(fā)時被執(zhí)行的Job的身份
startTime:Trigger第一次觸發(fā)的時間
endTime:Trigger失效的時間點
Trigger的其它屬性
優(yōu)先級(priority):如果Trigger很多,或者Quartz線程池的工作線程太少,Quartz可能沒有足夠的資源同事觸發(fā)所有的Trigger,這種情況下,如果希望某些Trigger優(yōu)先被觸發(fā),就需要給它設置優(yōu)先級,Trigger默認的優(yōu)先級為5,優(yōu)先級priority屬性的值可以是任意整數(shù),正數(shù)、負數(shù)都可以。(只有同時觸發(fā)的Trigger之間才會比較優(yōu)先級)
錯失觸發(fā)(misfire):如果Scheduler關閉了,或者Quartz線程池中沒有可用的線程來執(zhí)行Job,此時持久性的Trigger就會錯過其觸發(fā)時間,即錯失觸發(fā)。不同類型的Trigger,有不同的misfire機制,它們都默認使用“智能機制(smart policy)”,即根據(jù)Trigger的類型和配置動態(tài)調整行為,當Scheduler啟動的時候,查詢所有錯過觸發(fā)機制的持久性Trigger,然后根據(jù)它們各自的misfire機制更新Trigger的信息。
日歷(Calendar)示例
Quartz的Calendar對象(不是java.util.Calendar對象)可以在定義和存儲trigger的時候與trigger進行關聯(lián)。Calendar用于從trigger的調度計劃中排除時間段。
各種常用Trigger
SimpleTrigger
指定從某一個時間開始,以一定時間間隔(單位:毫秒)執(zhí)行的任務。
它的屬性有:
repeatInterval:重復間隔
repeatCount:重復次數(shù),實際執(zhí)行次數(shù)是repeatCount+1(因為在startTime的時候一定會執(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屬性的值會覆蓋repeatCount的屬性值。
TriggerBuilder(以及Quartz的其他Builder)會為那些沒有被顯示設置的屬性選擇合理的默認值,例如:如果沒有調用withIdentity(..)方法,TriggerBuilder會為trigger生成一個隨機的名稱;如果沒有調用startAt(..)方法,則默認使用當前時間,即trigger立即生效。
CalendarIntervalTrigger
類似于SimpleTrigger,指定從某一個時間開始,以一定的時間間隔執(zhí)行的任務。 但是不同的是SimpleTrigger指定的時間間隔為毫秒,沒辦法指定每隔一個月執(zhí)行一次(每月的時間間隔不是固定值),而CalendarIntervalTrigger支持的間隔單位有秒,分鐘,小時,天,月,年,星期。
相較于SimpleTrigger有兩個優(yōu)勢:
1、更方便,比如每隔1小時執(zhí)行,你不用自己去計算1小時等于多少毫秒
2、支持不是固定長度的間隔,比如間隔為月和年。但劣勢是精度只能到秒
它的屬性有:
interval 執(zhí)行間隔
intervalUnit 執(zhí)行間隔的單位(秒,分鐘,小時,天,月,年,星期)
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
指定每天的某個時間段內(nèi),以一定的時間間隔執(zhí)行任務。并且它可以支持指定星期。
它的屬性有:
startTimeOfDay 每天開始時間
endTimeOfDay 每天結束時間
daysOfWeek 需要執(zhí)行的星期
interval 執(zhí)行間隔
intervalUnit 執(zhí)行間隔的單位(秒,分鐘,小時,天,月,年,星期)
repeatCount 重復次數(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
適合于更復雜的任務,它支持類型于Linux Cron的語法(并且更強大)。
CronTrigger trigger = newTrigger()
.withIdentity("trigger1", "group1")
.startNow()
.withSchedule(cronSchedule("*/1 * * * * ?"))
.forJob(job)
.build();注意:如果一些調度要求太復雜,無法用單一觸發(fā)表示,那么就應該創(chuàng)建多個Trigger,Job和Trigger是松耦合的,一個Job可以定義多個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<Trigger> 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默認策略,即:把處理邏輯交給從Smart的Quartz去決定。
基本策略:
> 如果是只執(zhí)行一次的調度,使用MISFIRE_INSTRUCTION_FIRE_NOW
> 如果是無限次的調度(repeatCount是無限的),使用MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT
> 否則,使用MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT
MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY:忽略MisFire策略,在資源適合的時候,重新出發(fā)所有MisFire任務,不影響現(xiàn)有的調度
SimpleTrigger Misfire策略
MISFIRE_INSTRUCTION_FIRE_NOW:忽略已經(jīng)MisFire的任務,并且立即執(zhí)行調度,通常只適用于只執(zhí)行一次任務的場景
MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT:將startTime設置為當前時間,立即重新調度任務,包括MisFire的任務
MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT:與上一個策略類似,區(qū)別在于該策略會忽略MisFire的任務
MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_EXISTING_COUNT:在下一次調度的時間點,重新開始調度任務,包括MisFire的任務
MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT:與上一個策略類似,區(qū)別在于該策略會忽略MisFire的任務
CronTrigger Misfire策略
MISFIRE_INSTRUCTION_DO_NOTHING:什么都不做,繼續(xù)等下一次調度時間再觸發(fā)
MISFIRE_INSTRUCTION_FIRE_NOW:忽略已經(jīng)MisFire的任務,并且立即執(zhí)行調度,通常只適用于只執(zhí)行一次任務的場景
Listeners
Listener用于在調度過程中監(jiān)聽事件操作,不過,大多數(shù)情況下,用戶并不會使用Listener。JobListener、TriggerListener、SchedulerListener的用法類似,無非就是addXXXListener()、removeXXXListener()的操作,下面以JobListener為例介紹:
創(chuàng)建一個自定義的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的作用是什么,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學到更多知識。更多詳情敬請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)頁題目:Quartz中Trigger的作用是什么
URL地址:http://chinadenli.net/article16/jhgidg.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供用戶體驗、品牌網(wǎng)站建設、網(wǎng)站設計公司、網(wǎng)頁設計公司、營銷型網(wǎng)站建設、網(wǎng)站策劃
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)