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 @   Hekk丶  阅读(130)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示