一、前言
报!! 小南啊,今日有个小任务交给你去办。就是程序中有个数据处理,总是会出错,不知道是什么原因,你去处理一下!
二、主题
围绕数据处理问题去看,从中发现,是因为在多线程中,出现异常处理的时候,一下子就立马重试了,导致频频重试也是出错!一下子重试次数就达到了,导致并没有很好的缓冲效果。因此...
三、重试间隔
原始代码
package com.nan.task;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
/**
* @Author nanfang
* @Description TODO: Description
* @Date 2025/5/2
**/
@Slf4j
public class NanTask {
// 重试次数
private final static int MAX_RETRY = 5;
public static void main(String[] args) {
// 程序开始
log.info("nan task start");
int retry = 0;
while (retry < MAX_RETRY) {
try {
// 处理程序,默认会出错报错(抛出异常)
process();
} catch (Exception e) {
log.error("执行定时任务发生异常,准备执行第" + (retry + 1) + "次重试");
retry++;
}
}
log.info("nan task end");
}
/**
* TODO: 进程处理
*
* @Author nanfang
* @Date 2025/5/2
**/
private static void process() throws IOException {
// 抛出异常
throw new IOException("nan task error");
}
}
重试间隔
【相同间隔】
/**
* TODO: 时间间隔相同
*
* @Author nanfang
* @Date 2025/5/2
**/
private static void sameSleep(int retry, int tiems) throws InterruptedException {
log.info("same sleep start");
if (retry > 0) {
Thread.sleep(tiems);
log.error("过去了{}秒", tiems);
}
log.info("same sleep end");
}
【递增间隔】
/**
* TODO: 时间间隔递增
*
* @Author nanfang
* @Date 2025/5/2
**/
private static void progressSleep(int retry) throws InterruptedException {
log.info("progress sleep start");
if (retry > 0) {
// 当第一次重试,休眠 1 秒;第二次,休眠 2 秒;第三次,休眠 3 秒
int times = retry * 2 * 1000;
Thread.sleep(times);
log.error("过去了{}秒", retry * 2);
}
log.info("progress sleep end");
}
四、完整代码
package com.nan.task;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
/**
* @Author nanfang
* @Description TODO: Description
* @Date 2025/4/29
**/
@Slf4j
public class NanTask {
// 重试次数
private final static int MAX_RETRY = 5;
public static void main(String[] args) {
// 程序开始
log.info("nan task start");
int retry = 0;
while (retry < MAX_RETRY) {
try {
// 相同间隔时间
// int sleepSameTime = 1;
// sameSleep(retry, sleepSameTime * 1000);
// 递增间隔时间
progressSleep(retry);
// 处理程序,默认会出错报错(抛出异常)
process();
} catch (Exception e) {
log.error("执行定时任务发生异常,准备执行第" + (retry + 1) + "次重试");
retry++;
}
}
log.info("nan task end");
}
/**
* TODO: 时间间隔相同
*
* @Author nanfang
* @Date 2025/5/2
**/
private static void sameSleep(int retry, int tiems) throws InterruptedException {
log.info("same sleep start");
if (retry > 0) {
Thread.sleep(tiems);
log.error("过去了{}秒", tiems);
}
log.info("same sleep end");
}
/**
* TODO: 时间间隔递增
*
* @Author nanfang
* @Date 2025/5/2
**/
private static void progressSleep(int retry) throws InterruptedException {
log.info("progress sleep start");
if (retry > 0) {
// 当第一次重试,休眠 1 秒;第二次,休眠 2 秒;第三次,休眠 3 秒
int times = retry * 2 * 1000;
Thread.sleep(times);
log.error("过去了{}秒", retry * 2);
}
log.info("progress sleep end");
}
/**
* TODO: 进程处理
*
* @Author nanfang
* @Date 2025/4/29
**/
private static void process() throws IOException {
// 抛出异常
throw new IOException("nan task error");
}
}
五、运行结果
【相同时间间隔】
【递增时间间隔】