引言
在网络调用或分布式交互中,瞬时故障难以完全避免。为了保证系统的最终可用性,我们需要一种机制来应对这些'抖动'。今天咱们不依赖第三方库,直接手写一个轻量级的 Java 重试包装器。
核心设计思路
这个类的设计目标是通用且易于扩展。我们采用抽象基类的方式,让子类只需关注具体的业务逻辑,而将重试循环、异常捕获和退避策略统一收口管理。这样既保证了代码复用,又避免了在每个接口都写一遍 try-catch 循环。
public abstract class RetryWrap {
private static final Logger logger = LoggerFactory.getLogger(RetryWrap.class);
private static final String TASK_NAME = "重试机制";
private String threadName;
private int maxAttempts = 3;
private int nowAttempts = 0;
public void execute() throws Exception {
while (nowAttempts < maxAttempts) {
try {
doExecute();
return;
} catch (Exception e) {
nowAttempts++;
if (nowAttempts >= maxAttempts) {
logger.error("{} 重试耗尽", TASK_NAME, e);
throw e;
}
logger.warn("{} 第 {} 次失败,准备重试", TASK_NAME, nowAttempts);
Thread.sleep( * nowAttempts);
}
}
}
Exception;
}
继承这个类,重写 `doExecute` 方法即可。比如你要调用一个不稳定的 HTTP 接口:
虽然 Spring Retry 等功能强大,但在某些轻量级场景下,手写一个简单的包装类反而更可控。关键是理解重试的本质是'对抗不确定性',而不是盲目地无限循环。合理设置超时和退避策略,才能让系统更健壮。