赞
踩
org.quartz.JobExecutionException
会在 Scheduler(调度器)运行错误时,由 job(作业)实现类抛出。
在我们捕获异常并解决异常后,可以调用 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 定时任务(二):多线程并发执行与数据共享。
在我们捕获异常时,可以调用 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;
- }
上面的作业会在抛出异常后,就不再执行任何有关该作业的触发器了。
org.quartz.InterruptableJob
接口提供了一种中断机制,这个接口只有一个方法 interrupt()
,这个方法会在用户发出中断请求到 Scheduler(调度器)时触发(即调用 Scheduler#interrupt(JobDetail#getKey())
方法时触发)。
其中 InterruptableJob
接口又继承了 Job
接口,所以当我们使用时,只需要实现 InterruptableJob
接口,重写其中的 execute
和 interrupt
方法即可。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。