Quartz-异常处理
生活随笔
收集整理的這篇文章主要介紹了
Quartz-异常处理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 概述
- 示例
- 示例說明
- 說明
- 示例源碼
概述
我們根據官網示例說明Quartz在job執行異常情況時的處理。
參考官方原文:
http://www.quartz-scheduler.org/documentation/quartz-2.2.x/examples/Example6.html
本文涉及3個類:
BadJob1.java、
BadJob2.java
一個調度類 JobExceptionExample.java
示例
package com.xgj.quartz.quartzItself.exception;import java.text.SimpleDateFormat; import java.util.Date;import org.quartz.DisallowConcurrentExecution; import org.quartz.Job; import org.quartz.JobDataMap; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.quartz.JobKey; import org.quartz.PersistJobDataAfterExecution;/*** * * @ClassName: BadJob1* * @Description: setRefireImmediately* * @author: Mr.Yang* * @date: 2017年11月15日 上午1:10:17*/@PersistJobDataAfterExecution @DisallowConcurrentExecution public class BadJob1 implements Job {@Overridepublic void execute(JobExecutionContext context)throws JobExecutionException {SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");JobKey jobKey = context.getJobDetail().getKey();JobDataMap dataMap = context.getJobDetail().getJobDataMap();int flag = dataMap.getInt("flag");System.out.println("---" + jobKey + ",執行時間:"+ dateFormat.format(new Date()) + ", flag: " + flag);// 由于零錯誤除以此作業將生成的異常的例外(僅在第一次運行)try {int result = 4815 / flag;} catch (Exception e) {System.out.println("--- Job1 出錯!");// 修復分母,所以下次這個作業運行它不會再失敗JobExecutionException e2 = new JobExecutionException(e);dataMap.put("flag", "1");// 這個工作會立即重新啟動e2.setRefireImmediately(true);throw e2;}System.out.println("---" + jobKey + ",完成時間:"+ dateFormat.format(new Date()));}} package com.xgj.quartz.quartzItself.exception;import java.text.SimpleDateFormat; import java.util.Date;import org.quartz.DisallowConcurrentExecution; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.quartz.JobKey; import org.quartz.PersistJobDataAfterExecution;/*** * * @ClassName: BadJob2* * @Description: setUnscheduleAllTriggers* * @author: Mr.Yang* * @date: 2017年11月15日 上午1:10:24*/@PersistJobDataAfterExecution @DisallowConcurrentExecution public class BadJob2 implements Job {public void execute(JobExecutionContext context)throws JobExecutionException {SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");JobKey jobKey = context.getJobDetail().getKey();System.out.println("---" + jobKey + " ,執行時間:"+ dateFormat.format(new Date()));try {int result = 4815 / 0;} catch (Exception e) {System.out.println("--- job2 出錯!");// Quartz將自動取消與此作業相關聯的所有觸發器,以使其不再運行JobExecutionException e2 = new JobExecutionException(e);e2.setUnscheduleAllTriggers(true);throw e2;}System.out.println("---" + jobKey + ",完成時間:"+ dateFormat.format(new Date()));}} package com.xgj.quartz.quartzItself.exception;import static org.quartz.DateBuilder.nextGivenSecondDate; 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 org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerFactory; import org.quartz.SchedulerMetaData; import org.quartz.SimpleTrigger; import org.quartz.impl.StdSchedulerFactory;/*** * * @ClassName: JobExceptionExample* * @Description: 演示 Quartz 如何處理 從job中拋出的 JobExecutionExceptions* * @author: Mr.Yang* * @date: 2017年11月15日 上午1:10:02*/ public class JobExceptionExample {public void run() throws Exception {// 任務執行的時間 格式化SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");SchedulerFactory sf = new StdSchedulerFactory();Scheduler sched = sf.getScheduler();System.out.println("--------------- 初始化 -------------------");// 下一個15秒Date startTime = nextGivenSecondDate(null, 15);// badJob1 每10s執行一次 , 拋出異常,并立即重新執行JobDetail job = newJob(BadJob1.class).withIdentity("badJob1", "group1").usingJobData("flag", "0").build();SimpleTrigger trigger = newTrigger().withIdentity("trigger1", "group1").startAt(startTime).withSchedule(simpleSchedule().withIntervalInSeconds(10).repeatForever()).build();Date ft = sched.scheduleJob(job, trigger);System.out.println(job.getKey().getName() + " 將在: "+ dateFormat.format(ft) + " 時運行.并且重復: "+ trigger.getRepeatCount() + " 次, 每次間隔 "+ trigger.getRepeatInterval() / 1000 + " 秒");// badJob2 每5秒執行一次 , 并且 會拋出異常,然后 不再執行job = newJob(BadJob2.class).withIdentity("badJob2", "group1").build();trigger = newTrigger().withIdentity("trigger2", "group1").startAt(startTime).withSchedule(simpleSchedule().withIntervalInSeconds(5).repeatForever()).build();ft = sched.scheduleJob(job, trigger);System.out.println(job.getKey().getName() + " 將在: "+ dateFormat.format(ft) + " 時運行.并且重復: "+ trigger.getRepeatCount() + " 次, 每次間隔 "+ trigger.getRepeatInterval() / 1000 + " 秒");sched.start();System.out.println("------- 開始調度 (調用.start()方法) ----------------");try {// 睡眠 30sThread.sleep(60L * 1000L);} catch (Exception e) {}sched.shutdown(false);// 顯示一下 已經執行的任務信息SchedulerMetaData metaData = sched.getMetaData();System.out.println("~~~~~~~~~~ 執行了 "+ metaData.getNumberOfJobsExecuted() + " 個 jobs.");}public static void main(String[] args) throws Exception {JobExceptionExample example = new JobExceptionExample();example.run();} }運行結果
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 --------------- 初始化 ------------------- badJob1 將在: 2017-11-15 01:14:15 時運行.并且重復: -1 次, 每次間隔 10 秒 badJob2 將在: 2017-11-15 01:14:15 時運行.并且重復: -1 次, 每次間隔 5 秒 INFO QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started. ------- 開始調度 (調用.start()方法) ---------------- ---group1.badJob1,執行時間:2017-11-15 01:14:15, flag: 0 --- Job1 出錯! ---group1.badJob2 ,執行時間:2017-11-15 01:14:15 --- job2 出錯! INFO JobRunShell - Job group1.badJob1 threw a JobExecutionException: org.quartz.JobExecutionException: java.lang.ArithmeticException: / by zeroat com.xgj.quartz.quartzItself.exception.BadJob1.execute(BadJob1.java:51)at org.quartz.core.JobRunShell.run(JobRunShell.java:202)at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) Caused by: java.lang.ArithmeticException: / by zeroat com.xgj.quartz.quartzItself.exception.BadJob1.execute(BadJob1.java:45)... 2 common frames omitted INFO JobRunShell - Job group1.badJob2 threw a JobExecutionException: org.quartz.JobExecutionException: java.lang.ArithmeticException: / by zeroat com.xgj.quartz.quartzItself.exception.BadJob2.execute(BadJob2.java:44)at org.quartz.core.JobRunShell.run(JobRunShell.java:202)at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) Caused by: java.lang.ArithmeticException: / by zeroat com.xgj.quartz.quartzItself.exception.BadJob2.execute(BadJob2.java:38)... 2 common frames omitted ---group1.badJob1,執行時間:2017-11-15 01:14:15, flag: 1 ---group1.badJob1,完成時間:2017-11-15 01:14:15 ---group1.badJob1,執行時間:2017-11-15 01:14:25, flag: 1 ---group1.badJob1,完成時間:2017-11-15 01:14:25 ---group1.badJob1,執行時間:2017-11-15 01:14:35, flag: 1 ---group1.badJob1,完成時間:2017-11-15 01:14:35 ---group1.badJob1,執行時間:2017-11-15 01:14:45, flag: 1 ---group1.badJob1,完成時間:2017-11-15 01:14:45 ---group1.badJob1,執行時間:2017-11-15 01:14:55, flag: 1 ---group1.badJob1,完成時間:2017-11-15 01:14:55 ---group1.badJob1,執行時間:2017-11-15 01:15:05, flag: 1 ---group1.badJob1,完成時間:2017-11-15 01:15:05 INFO QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutting down. INFO QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED paused. INFO QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutdown complete. ~~~~~~~~~~ 執行了 8 個 jobs.示例說明
job1:在拋出異常后,然后將flag設置成1,也就是說只有第一次會有異常拋出,以后都正常代碼
setRefireImmediately(true);它設置了 job 類拋出異常后的處理方式,此處意為發生異常后立即重新執行job2:和job1不同,它沒有判斷,執行一次就拋出一次異常
e2.setUnscheduleAllTriggers(true);設置了去掉它的觸發器,也就意味著 BadJob2 如果發生異常,就沒有機會再執行了說明
在 job1.java 和 job2.java 中的異常如果不拋出(注釋掉),會有什么結果發生呢?
// throw e2;-- 注釋掉這一行后執行job1如果不拋出:執行正常,因為在異常處理中有重啟job語句
job2如果不拋出:任務每次都執行,每次都進入異常。相當于后續的任務沒有停止。
示例源碼
代碼已托管到Github—> https://github.com/yangshangwei/SpringMaster
總結
以上是生活随笔為你收集整理的Quartz-异常处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring-常见问题25问
- 下一篇: Quartz-中断正在执行的任务