业调度框架 Quartz 学习笔记(六) -- job生病了(抛出异常)时的处理
2017-10-24 00:00
477 查看
摘要: 作业调度框架 Quartz 学习笔记(六) -- job生病了(抛出异常)时的处理
我们一直没有太深入的去完成 一个job 类,因为这是跟你的实际应用紧密相关联的,但是在你的job 处理过程中
如果 发生了异常,那么会怎么样处理呢 ? 客官您往下看…………
------------------------------------我是分割线------------------------------------------------
如果客官看过前面的几篇 烂的掉渣的 文章后,会知道下面会先贴代码,一个job类,一个调度类。
但这次有点不同的是这次 没有烂的掉渣,而是烂的更掉渣,-.-
两个job类:BadJob1.java 和 BadJob2.java
一个调度类: JobExceptionExample.java
BadJob1.java
BadJob2.java
JobExceptionExample.java
说明:
1 类JobExceptionExample.java 没什么可说的了,完全 按套路走的
2 类BadJob1 的代码 34-44 行 从Map 中取出 denominator 如果 是0 抛出异常,然后将denominator设置成1,也就是说只有第一次会有异常抛出,以后都 正常
代码 41 行是关键: e2.setRefireImmediately(true); 它设置了 job 类抛出异常后的处理方式 ,此处意为 发生异常后 立即重新执行
3 类BadJob2 的代码 和 BadJob1 不同,它没有判断,执行一次 就抛出一次异常,
但在 第26行处: e2.setUnscheduleAllTriggers(true);
设置了 去掉它的 触发器, 也就意味着 BadJob2 如果 发生异常,就没有机会再执行了 (悲催的孩子) 0.0
提醒: 别忘了 BadJob类上的
@PersistJobDataAfterExecution
@DisallowConcurrentExecution
这两句注释
一个小问题: 如果 发生异常 而没有设置 异常时的处理策略 那会是什么样,自己试试把BadJob2 中的 代码 注释掉 看看结果吧
我们一直没有太深入的去完成 一个job 类,因为这是跟你的实际应用紧密相关联的,但是在你的job 处理过程中
如果 发生了异常,那么会怎么样处理呢 ? 客官您往下看…………
------------------------------------我是分割线------------------------------------------------
如果客官看过前面的几篇 烂的掉渣的 文章后,会知道下面会先贴代码,一个job类,一个调度类。
但这次有点不同的是这次 没有烂的掉渣,而是烂的更掉渣,-.-
两个job类:BadJob1.java 和 BadJob2.java
一个调度类: JobExceptionExample.java
BadJob1.java
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.PersistJobDataAfterExecution; @PersistJobDataAfterExecution @DisallowConcurrentExecution public class BadJob2 implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { // 任务执行的时间 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String jobName = context.getJobDetail().getKey().getName(); System.out.println("---" + jobName + " 在[ " + dateFormat.format(new Date())+ " ] 执行!! ") ; System.err.println("--- 在 BadJob 2 中发生 错误, 将停止运行!! "); JobExecutionException e2 = new JobExecutionException(new Exception()); // 设置 将自动 去除 这个任务的触发器,所以这个任务不会再执行 //e2.setUnscheduleAllTriggers(true); // 抛出异常 throw e2; } }
BadJob2.java
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.PersistJobDataAfterExecution; @PersistJobDataAfterExecution @DisallowConcurrentExecution public class BadJob2 implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { // 任务执行的时间 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String jobName = context.getJobDetail().getKey().getName(); System.out.println("---" + jobName + " 在[ " + dateFormat.format(new Date())+ " ] 执行!! ") ; System.err.println("--- 在 BadJob 2 中发生 错误, 将停止运行!! "); JobExecutionException e2 = new JobExecutionException(new Exception()); // 设置 将自动 去除 这个任务的触发器,所以这个任务不会再执行 e2.setUnscheduleAllTriggers(true); // 抛出异常 throw e2; } }
JobExceptionExample.java
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; /** 演示 Quartz 如何 处理 从job中 抛出的 JobExecutionExceptions */ public class JobExceptionExample { public static void main(String[] args) throws Exception { JobExceptionExample example = new JobExceptionExample(); example.run(); } 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("denominator", "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 { // 睡眠 30s Thread.sleep(60L * 1000L); } catch (Exception e) { } sched.shutdown(false); // 显示一下 已经执行的任务信息 SchedulerMetaData metaData = sched.getMetaData(); System.out.println("~~~~~~~~~~ 执行了 " + metaData.getNumberOfJobsExecuted() + " 个 jobs."); } }
说明:
1 类JobExceptionExample.java 没什么可说的了,完全 按套路走的
2 类BadJob1 的代码 34-44 行 从Map 中取出 denominator 如果 是0 抛出异常,然后将denominator设置成1,也就是说只有第一次会有异常抛出,以后都 正常
代码 41 行是关键: e2.setRefireImmediately(true); 它设置了 job 类抛出异常后的处理方式 ,此处意为 发生异常后 立即重新执行
3 类BadJob2 的代码 和 BadJob1 不同,它没有判断,执行一次 就抛出一次异常,
但在 第26行处: e2.setUnscheduleAllTriggers(true);
设置了 去掉它的 触发器, 也就意味着 BadJob2 如果 发生异常,就没有机会再执行了 (悲催的孩子) 0.0
提醒: 别忘了 BadJob类上的
@PersistJobDataAfterExecution
@DisallowConcurrentExecution
这两句注释
一个小问题: 如果 发生异常 而没有设置 异常时的处理策略 那会是什么样,自己试试把BadJob2 中的 代码 注释掉 看看结果吧
相关文章推荐
- 作业调度框架 Quartz 学习笔记(六) -- job生病了(抛出异常)时的处理
- 作业调度框架 Quartz 学习笔记(六) -- job生病了(抛出异常)时的处理
- 作业调度框架 Quartz 学习笔记(六) -- job生病了(抛出异常)时的处理
- Quartz学习(七)--job生病了(抛出异常)时的处理
- 作业调度框架 Quartz 学习笔记(二) -- 简单触发器(SimpleTrigger)
- 【Java学习笔记之三十二】浅谈Java中throw与throws的用法及异常抛出处理机制剖析
- 作业调度框架 Quartz 学习笔记(三) -- Cron表达式
- 作业调度框架 Quartz 学习笔记(一) -- HelloWorld !!!
- 作业调度框架 Quartz 学习笔记(五) -- 错过的任务怎么办?
- 作业调度框架 Quartz 学习笔记(四) -- 接收参数和维护状态
- 作业调度框架 Quartz 学习笔记(三) -- Cron表达式
- 作业调度框架 Quartz 学习笔记
- 作业调度框架 Quartz 学习笔记(二) -- 简单触发器(SimpleTrigger)
- 作业调度框架 Quartz 学习笔记(三) -- Cron表达式 (转载)
- j2me学习笔记【5】——抛出异常处理的小例子
- 作业调度框架 Quartz 学习笔记(四) -- 接收参数和维护状态
- 作业调度框架 Quartz 学习笔记(三) -- Cron表达式
- 作业调度框架 Quartz 学习笔记(五) -- 错过的任务怎么办?
- 作业调度框架 Quartz 学习笔记(四) -- 接收参数和维护状态
- 作业调度框架 Quartz 学习笔记