文章目录

  • 概述
  • 示例
  • 示例说明
  • 说明
  • 示例源码

概述

我们根据官网示例说明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-异常处理相关推荐

  1. quartz集群调度机制调研及源码分析---转载

    quartz2.2.1集群调度机制调研及源码分析 引言 quartz集群架构 调度器实例化 调度过程 触发器的获取 触发trigger: Job执行过程: 总结: 附: 引言 quratz是目前最为成 ...

  2. java quartz spring_JavaLib-quartz | 基于Spring Boot Quartz开发的定时任务

    基于Spring Boot Quartz开发的JavaLib-quartz,目的是帮你快速构建定时任务系统,你可以专心编写你的业务逻辑,而不必关注定时任务具体是如何实现的,他的性能如何,有没有异常以及 ...

  3. Jeecg-Boot异常处理'jeecg-boot.QRTZ_LOCKS' doesn't exist

    Jeecg-Boot异常处理'jeecg-boot.QRTZ_LOCKS' doesn't exist 提示表不存在问题Table 'jeecg-boot.QRTZ_LOCKS' doesn't ex ...

  4. quartz SpringMvc 动态定时任务(quartz2.2)

    java自带定时任务可以解决部分问题但是当我们要动态执行定时任务时,quartz可以帮助我们有效解决这类型问题 代码亲测可用 springmvc中配置注入调度器scheduler,调用定时任务 < ...

  5. quartz集成到springboot_一个用来学习 spring boot 的开源项目,总共包含 57 个集成demo...

    spring-boot-demo 一个用来学习 spring boot 的项目,总共包含 57 个集成demo. 包含集成 actuator(监控).admin(可视化监控).logback(日志). ...

  6. oracle trigger 延迟执行_springboot中定时任务执行Quartz的使用

    环境:springboot2.2.11.RELEASE 2种方式执行定时任务 1.通过springboot的方式 2.使用Quartz实现定时任务 方式一:通过springboot的定时任务 1.开启 ...

  7. quartz的schedulerFactory实现解析

    由于需要实现一个scheduler,用于添加job,更改job等功能,但是没有调度功能.没错主要是用于监控和管理集群用的.所以需要仔细看scheduler的接口规范,于是又了这篇文章. Schedul ...

  8. Java定时器Timer和第三方定时器Quartz

    概述 定时器在应用广泛,比如定时统计数据生成报表.每隔设定的时间提醒用户等.Java.util包自带的定时器Timer提供简单的定点执行功能,而Quartz是一个第三方提供的定时器框架. 对比 Tim ...

  9. quartz集群模式任务触发分析(二)

    前言 此处仅大致的将quartz的逻辑给理出来,有些具体的详细之处我也不是很清楚(苦笑) QuartzSchedulerThread quartzSchedulerThread是quartz的主线程, ...

  10. Go语言的错误异常处理机制及其应用

    一.背景 在日常编写golang程序或阅读别人的golang代码时,我们总会看到如下的一堆代码块: xx, err = func(xx) if err != nil {//do sth. to tac ...

最新文章

  1. linux机群下NFS+NIS服务的搭建以及MPICH的简单安装
  2. eclipse远程连接Hadoop,用户认证失败
  3. [react] 你有用过React的插槽(Portals)吗?怎么用?
  4. 如何安装_如何安装吸顶灯?吸顶灯安装注意事项
  5. 数据统计告诉你,程序员是不是35岁就退休
  6. python四大高阶函数_四大高阶函数
  7. mex 1 hello,world
  8. 勤能补拙 VS 思考补拙
  9. 服务器向客户端发送数据自动中断
  10. 电脑同时安装python2和3_电脑上同时安装Python2和Python3
  11. spring源码之下载及构建
  12. 自动驾驶-毫米波雷达系列基础篇-测速原理
  13. python实现堆栈 后进先出 LIFO
  14. 高端存储十面埋伏 华为全闪存系列亮剑出击
  15. 随机过程 Class 3 条件期望
  16. 序列试题---最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离 .
  17. 全球与中国飞机内部照明系统市场深度研究分析报告(2021)
  18. Java--Mac系统终端编译运行java文件
  19. moudle.txt
  20. 【云贝学院】揭秘TDSQL分布式实例扩容的逻辑流程

热门文章

  1. C++虚继承下的内存模型(二)
  2. 登录 googlecloud,链接数据库
  3. C语言结构体通过 scanf初始化
  4. java 协程线程的区别_为什么 Java 坚持多线程不选择协程?
  5. NLP-基础知识-005(专家系统)
  6. python爬虫基础(二)~工具包: 下载包requests、urllib和解析包BeautifulSoup(bs4)、lxml.etree.xpath
  7. python 笔记:nltk (标记英文单词词性等)
  8. Java高阶部分知识点汇总(四)-继承与多态
  9. MATLAB应用实战系列(五十一)-TXT数据的读取完美教程
  10. 算法岗一片红海,如何选择适合自己的方向?