摘要:注意为了共享在同一个中的,我们需要在上面这个实现类上加入和注解,详见定时任务二多线程并发执行与数据共享。捕获异常,取消所有触发器在我们捕获异常时,可以调用取消所有与这个作业有关的触发器。
1. 作业异常版权声明:本文由吴仙杰创作整理,转载请注明出处:https://segmentfault.com/a/1190000009141079
org.quartz.JobExecutionException 会在 Scheduler(调度器)运行错误时,由 job(作业)实现类抛出。
1.1 捕获并解决异常,立即重新执行作业在我们捕获异常并解决异常后,可以调用 JobExecutionException#setRefireImmediately(true) 立即重新执行作业。
假设我们有一个会抛出异常的 job 实现类,job 实现类的代码片断如下:
try { // 一个异常例子,假设第一次传入的 denominator 为 0,那么将会抛出异常 calculation = 4815 / denominator; } catch (Exception e) { JobExecutionException e2 = new JobExecutionException(e); // 在第一次异常后,修改 denominator 参数为 1,那么后面的执行就不会出错了 dataMap.put("denominator", "1"); // true 表示立即重新执行作业 e2.setRefireImmediately(true); throw e2; }
上面的作业会在第一次执行时抛出 java.lang.ArithmeticException: / by zero 异常后,马上又会执行一次,之后都可以正常执行作业。
注意: 为了共享在同一个 JobDetail 中的 JobDataMap,我们需要在上面这个 job 实现类上加入 @PersistJobDataAfterExecution 和 @DisallowConcurrentExecution 注解,详见 Quartz 2 定时任务(二):多线程并发执行与数据共享。
1.2 捕获异常,取消所有触发器在我们捕获异常时,可以调用 JobExecutionException#setUnscheduleAllTriggers(true) 取消所有与这个作业有关的触发器。
假设我们有一个会抛出异常的 job 实现类,job 实现类的代码片断如下:
try { // 一个异常例子 int zero = 0; calculation = 4815 / zero; } catch (Exception e) { JobExecutionException e2 = new JobExecutionException(e); // true 表示 Quartz 会自动取消所有与这个 job 有关的 trigger,从而避免再次运行 job e2.setUnscheduleAllTriggers(true); throw e2; }
上面的作业会在抛出异常后,就不再执行任何有关该作业的触发器了。
2. 作业中断org.quartz.InterruptableJob 接口提供了一种中断机制,这个接口只有一个方法 interrupt(),这个方法会在用户发出中断请求到 Scheduler(调度器)时触发(即调用 Scheduler#interrupt(JobDetail#getKey()) 方法时触发)。
其中 InterruptableJob 接口又继承了 Job 接口,所以当我们使用时,只需要实现 InterruptableJob 接口,重写其中的 execute 和 interrupt 方法即可。
3. 参考Quartz API
PS:本文针对的 Quartz 版本为 Quartz 2.2.3。官方下载地址:Quartz 2.2.3 .tar.gz
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/67077.html
摘要:由于标题长度限制,原题是这样某系统万,每十分钟统计一下请求次数最多的个。请求写到日志的话,其实就是超大文件中统计问题。 由于标题长度限制,原题是这样:某系统QPS100万,每十分钟统计一下请求次数最多的100个IP。ip请求写到日志的话,其实就是超大文件中统计top k问题。10分钟6亿条记录,大约是10G级别,所以对于一般单机处理来讲不能一次性加载到内存计算。所以分治算法是处理这类问...
摘要:在定时器接口的方法中我们可以发现一个方法接受接口,而也是一个接口,抽象了触发任务执行的触发器。更常用的一个触发器是,它使用表达式指定何时执行任务。配置定时任务首先看看配置。配置提供了命名空间,让配置定时任务非常简单。 本文参考自Spring官方文档 34. Task Execution and Scheduling。 在程序中常常有定时任务的需求,例如每隔一周生成一次报表、每个月月末清...
摘要:三实践案例案例简介分布式系统中,微服务基础组件等,系统中间件,等,对常用功能配置等,进行二次浅封装并统一集成管理,以满足日常开发中基础环境搭建与临时工具的快速实现。 一、背景简介 分布式系统中存在很多拆分的服务,在不断迭代升级的过程中,会出现如下常见的棘手情况: 某个技术组件版本升级,依赖包升级导致部分语法或者API过期,或者组件修复紧急的问题,从而会导致分布式系统下各个服...
摘要:也是自带的一个基于线程池设计的定时任务类。其每个调度任务都会分配到线程池中的一个线程执行,所以其任务是并发执行的,互不影响。 原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10659045.html,否则将追究法律责任!!! 一、在JAVA开发领域,目前可以通过以下几种方式进行定时任务 1、单机部署模式 Timer:jdk中...
阅读 2959·2023-04-26 00:23
阅读 3372·2021-09-13 10:28
阅读 2130·2021-08-31 14:18
阅读 2835·2019-08-30 15:54
阅读 1869·2019-08-30 15:43
阅读 1234·2019-08-29 16:56
阅读 2779·2019-08-29 14:16
阅读 2026·2019-08-28 17:51