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

1. 作业异常

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. 参考

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值