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,即可自动重试

posted @ 2024-06-28 20:02  Hekk丶  阅读(276)  评论(0)    收藏  举报