Quartz 2 定时任务(三):异常与中断处理

版权声明:本文由吴仙杰创做整理,转载请注明出处:http://www.javashuo.com/article/p-htuxizqf-bc.htmlhtml

1. 做业异常

org.quartz.JobExecutionException 会在 Scheduler(调度器)运行错误时,由 job(做业)实现类抛出。java

1.1 捕获并解决异常,当即从新执行做业

在咱们捕获异常并解决异常后,能够调用 JobExecutionException#setRefireImmediately(true) 当即从新执行做业。segmentfault

假设咱们有一个会抛出异常的 job 实现类,job 实现类的代码片段以下:api

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) 取消全部与这个做业有关的触发器。.net

假设咱们有一个会抛出异常的 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;
}

上面的做业会在抛出异常后,就再也不执行任何有关该做业的触发器了。code

2. 做业中断

org.quartz.InterruptableJob 接口提供了一种中断机制,这个接口只有一个方法 interrupt(),这个方法会在用户发出中断请求到 Scheduler(调度器)时触发(即调用 Scheduler#interrupt(JobDetail#getKey()) 方法时触发)。htm

其中 InterruptableJob 接口又继承了 Job 接口,因此当咱们使用时,只须要实现 InterruptableJob 接口,重写其中的 executeinterrupt 方法便可。

3. 参考

PS:本文针对的 Quartz 版本为 Quartz 2.2.3。官方下载地址:Quartz 2.2.3 .tar.gz

相关文章
相关标签/搜索