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,即可自动重试
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix