Quartz实现任务重试方案
1、抛出JobExecutionException异常
public class CreateTaskJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
int refireCount = context.getRefireCount();
//判断重试次数
if (refireCount >= 5) {
return;
}
try {
doSomething();
} catch (Exception ex) {
//true表示立即执行
throw new JobExecutionException(ex, true);
}
}
private void doSomething() {}
}
缺点:无法控制重试间隔
2、创建新Job的方式
/**
* 可重试job
* @author hefeiyu 2024-06-28 19:50
*/
@Slf4j
public abstract class AbsRetryJob implements Job {
/**
* job执行逻辑,子类中实现
*/
public abstract void doExecute();
/**
* 最大重试次数
*/
private int maxRetry = 5;
/**
* 执行间隔
*/
private long interval = 6000;
public void setMaxRetry(int maxRetry) {
this.maxRetry = maxRetry;
}
public void setInterval(long interval) {
this.interval = interval;
}
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
try {
doExecute();
} catch (Exception ex) {
JobDataMap jodData = context.getJobDetail().getJobDataMap();
//retry
String retryStr = (String) jodData.get("retry");
int retry = 0;
if (StringUtils.hasText(retryStr)) {
retry = Integer.parseInt(retryStr);
}
if (retry >= maxRetry) {
log.error("{}重试后,job执行失败", maxRetry);
} else {
retry += 1;
log.info("进行尝试,retry:{}", retry);
//构建新任务
JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put("retry", retry + "");
JobDetail jobDetail = JobBuilder
.newJob(this.getClass())
.usingJobData(jobDataMap)
.build();
Trigger trigger = TriggerBuilder
.newTrigger()
.startAt(new Date(System.currentTimeMillis() + interval * retry))
.build();
try {
context.getScheduler().scheduleJob(jobDetail, trigger);
} catch (SchedulerException e) {
throw new RuntimeException(e);
}
}
}
}
}
在需要重试的job集成AbsRetryJob,并实现doExecute,即可自动重试

浙公网安备 33010602011771号