Quartz-TriggerListener解读
文章目錄
- 概述
- TriggerListener接口方法
- 示例
- 示例源碼
概述
Quartz-JobListener解讀
與 JobListener 有所不同的是, TriggerListener 接口還有關于 Trigger 實例生命周期的方法。
TriggerListener接口方法
我們先看下TriggerListener的源碼
import org.quartz.Trigger.CompletedExecutionInstruction;public interface TriggerListener {String getName();void triggerFired(Trigger var1, JobExecutionContext var2);boolean vetoJobExecution(Trigger var1, JobExecutionContext var2);void triggerMisfired(Trigger var1);void triggerComplete(Trigger var1, JobExecutionContext var2, CompletedExecutionInstruction var3); }-
getName():和前面的 JobListener 一樣,TriggerListner 接口的 getName()返回一個字符串用以說明監聽器的名稱。對于非全局的 TriggerListener,在 addTriggerListener()方法中給定的名稱必須與監聽器的 getName() 方法返回值相匹配。
-
triggerFired() :當與監聽器相關聯的 Trigger 被觸發,Job 上的 execute()方法將要被執行時,Scheduler 就調用這個方法。在全局 TriggerListener 情況下,這個方法為所有 Trigger被調用。
-
vetoJobExecution():在 Trigger 觸發后,Job 將要被執行時由 Scheduler調用這個方法。TriggerListener 給了一個選擇去否決 Job 的執行。假如這個方法返回 true,這個 Job 將不會為此次Trigger 觸發而得到執行。
-
triggerMisfired():Scheduler 調用這個方法是在 Trigger 錯過觸發時。如這個方法的 JavaDoc所指出的,你應該關注此方法中持續時間長的邏輯:在出現許多錯過觸發的 Trigger 時,長邏輯會導致骨牌效應。你應當保持這上方法盡量的小。
-
triggerComplete():Trigger 被觸發并且完成了 Job 的執行時,Scheduler 調用這個方法。這不是說這個Trigger 將不再觸發了,而僅僅是當前 Trigger 的觸發(并且緊接著的 Job 執行) 結束時。這個 Trigger也許還要在將來觸發多次的。
示例
Job
package com.xgj.quartz.quartzItself.listener.triggerListener;import java.text.SimpleDateFormat; import java.util.Date;import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.quartz.JobKey;public class SimpleJob1 implements Job {public void execute(JobExecutionContext context)throws JobExecutionException {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");JobKey jobKey = context.getJobDetail().getKey();System.out.println("\nJob1 - 任務key "+ jobKey+ "執行時間:"+ sdf.format(new Date()));} }Job
package com.xgj.quartz.quartzItself.listener.triggerListener;import java.text.SimpleDateFormat; import java.util.Date;import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.quartz.JobKey;public class SimpleJob2 implements Job {public void execute(JobExecutionContext context)throws JobExecutionException {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");JobKey jobKey = context.getJobDetail().getKey();System.err.println("\nJob2 - 任務key "+ jobKey+ "執行時間:"+ sdf.format(new Date()));} }自定義TriggerListener
package com.xgj.quartz.quartzItself.listener.triggerListener;import org.quartz.JobExecutionContext; import org.quartz.Trigger; import org.quartz.TriggerListener;public class MyTriggerListener implements TriggerListener {@Overridepublic String getName() {return "MyTriggerListener";}/*** (1) Trigger被激發 它關聯的job即將被運行** @param trigger* @param context*/@Overridepublic void triggerFired(Trigger trigger, JobExecutionContext context) {System.out.println("MyTrigger監聽器:" + trigger.getJobKey()+ ",進入方法 triggerFired()");}/*** (2) Trigger被激發 它關聯的job即將被運行,先執行(1),在執行(2) 如果返回TRUE 那么任務job會被終止** @param trigger* @param context* @return*/@Overridepublic boolean vetoJobExecution(Trigger trigger, JobExecutionContext context) {System.out.println("MyTrigger監聽器:" + trigger.getJobKey()+ ",vetoJobExecution()");return false;}/*** (3) 當Trigger錯過被激發時執行,比如當前時間有很多觸發器都需要執行,但是線程池中的有效線程都在工作,那么有的觸發器就有可能超時,* 錯過這一輪的觸發。** @param trigger*/@Overridepublic void triggerMisfired(Trigger trigger) {System.out.println("MyTrigger監聽器:" + trigger.getJobKey()+ ",triggerMisfired()");}/*** (4) 任務完成時觸發** @param trigger* @param jobExecutionContext* @param completedExecutionInstruction*/@Overridepublic void triggerComplete(Trigger trigger,JobExecutionContext jobExecutionContext,Trigger.CompletedExecutionInstruction completedExecutionInstruction) {System.out.println("MyTrigger監聽器:" + trigger.getJobKey()+ ",triggerComplete()");} }調度類
package com.xgj.quartz.quartzItself.listener.triggerListener;import static org.quartz.JobBuilder.newJob; import static org.quartz.TriggerBuilder.newTrigger;import org.quartz.JobDetail; import org.quartz.Matcher; import org.quartz.Scheduler; import org.quartz.SchedulerFactory; import org.quartz.SchedulerMetaData; import org.quartz.Trigger; import org.quartz.TriggerKey; import org.quartz.TriggerListener; import org.quartz.impl.StdSchedulerFactory; import org.quartz.impl.matchers.KeyMatcher;public class TriggerListenerDemo {public static void main(String[] args) throws Exception {System.out.println("------- 初始化 ----------------------");// SchedulerSchedulerFactory schedulerFactory = new StdSchedulerFactory();Scheduler scheduler = schedulerFactory.getScheduler();// JobJobDetail job = newJob(SimpleJob1.class).withIdentity("job1","group1").build();// TirggerTrigger trigger = newTrigger().withIdentity("trigger1", "group1").startNow().build();// 設置監聽器TriggerListener triggerListener = new MyTriggerListener();Matcher<TriggerKey> matcher = KeyMatcher.keyEquals(trigger.getKey());scheduler.getListenerManager().addTriggerListener(triggerListener,matcher);// 將job任務加入到調度器scheduler.scheduleJob(job, trigger);// 開始任務System.out.println("------- 開始執行調度器 Scheduler ----------------");scheduler.start();try {System.out.println("------- 等待 30 秒... --------------");Thread.sleep(30L * 1000L);} catch (Exception e) {e.printStackTrace();}scheduler.shutdown(true);System.out.println("------- 關閉調度器 -----------------");SchedulerMetaData metaData = scheduler.getMetaData();System.out.println("~~~~~~~~~~ 執行了 "+ metaData.getNumberOfJobsExecuted() + " 個 jobs.");}}運行結果
------- 初始化 ---------------------- INFO StdSchedulerFactory - Using default implementation for ThreadExecutor INFO SimpleThreadPool - Job execution threads will use class loader of thread: main INFO SchedulerSignalerImpl - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl INFO QuartzScheduler - Quartz Scheduler v.2.2.3 created. INFO RAMJobStore - RAMJobStore initialized. INFO QuartzScheduler - Scheduler meta-data: Quartz Scheduler (v2.2.3) 'DefaultQuartzScheduler' with instanceId 'NON_CLUSTERED'Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.NOT STARTED.Currently in standby mode.Number of jobs executed: 0Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.INFO StdSchedulerFactory - Quartz scheduler 'DefaultQuartzScheduler' initialized from default resource file in Quartz package: 'quartz.properties' INFO StdSchedulerFactory - Quartz scheduler version: 2.2.3 ------- 開始執行調度器 Scheduler ---------------- INFO QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started. ------- 等待 30 秒... -------------- MyTrigger監聽器:group1.job1,進入方法 triggerFired() MyTrigger監聽器:group1.job1,vetoJobExecution()Job1 - 任務key group1.job1執行時間:2017-11-16 21:52:50 MyTrigger監聽器:group1.job1,triggerComplete() INFO QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutting down. INFO QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED paused. INFO QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutdown complete. ------- 關閉調度器 ----------------- ~~~~~~~~~~ 執行了 1 個 jobs.示例源碼
代碼已托管到Github—> https://github.com/yangshangwei/SpringMaster
總結
以上是生活随笔為你收集整理的Quartz-TriggerListener解读的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Quartz-JobListener解读
- 下一篇: Quartz-SchedulerList