java quartz 失败重试_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 方法即可。
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 方法即可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
2017-05-24 Java POI 3.17写入、导入EXCEL性能测试
2011-05-24 Js下拉框树型选择控件(盖住select下拉框元素)