任务执行时
JobExecutionException,如任务失败时触发一些动作
@Override
protected void executeInternal(@NotNull JobExecutionContext jobExecutionContext) throws JobExecutionException {
try {
// 执行任务
} catch (Exception e) {
JobExecutionException jobExecutionException = new JobExecutionException(e);
// 立即重复执行,谨慎使用,如果你知道异常原因,可以使用,如果不知道异常原因,可能导致死循环
jobExecutionException.setRefireImmediately(true);
// 中断所有关联此jobDetail的任务
jobExecutionException.unscheduleAllTriggers();
// 中断所有关联此jobDetail且正在执行的任务
jobExecutionException.unscheduleFiringTrigger();
throw jobExecutionException;
}
}
InterruptableJob自定义中断某次任务的执行,而不是移除
public class MySpringQuartzJob extends QuartzJobBean implements InterruptableJob {
private boolean stop;
@Override
protected void executeInternal(@NotNull JobExecutionContext jobExecutionContext) throws JobExecutionException {
try {
for (int i = 0; i < 50; i++) {
if (stop){
return;
}
log.info("继续执行业务逻辑");
}
} catch (Exception e) {
throw new JobExecutionException(e);
}
}
@Override
public void interrupt() throws UnableToInterruptJobException {
stop = true;
}
}
调度器通知该任务中断
// 通知中断
scheduler.interrupt(new JobKey("job-1"));
requestRecovery关键字设置
JobDetail jobDetail = JobBuilder.newJob(MySpringQuartzJob.class)
.withIdentity("job-2")
.requestRecovery() // 仅对jdbc持久化方式生效,如果任务中途挂掉,比如宕机了,下次重启服务器自动执行
.build();
withPriority设置优先级,默认是5,如果有多个触发器执行同一个JobDetail,优先级高的先执行
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger-2")
.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(30))
.startNow()
.modifiedByCalendar("holidays")
.withPriority(5)
.build();