用java做一个失败重试的工具类
时间: 2024-09-28 18:05:19 浏览: 16
在Java中,我们可以创建一个简单的工具类来封装失败重试机制。这个工具类通常会包含一个静态方法,接受一个函数(方法),该方法需要执行的操作以及最大重试次数和延迟时间作为参数。下面是一个基础的实现示例:
```java
import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;
public class RetryUtil {
// 设置默认的最大重试次数和延迟时间(这里以秒为单位)
private static final int DEFAULT_MAX_RETRIES = 5;
private static final int DEFAULT_RETRY_DELAY = 1;
/**
* 封装了失败重试操作
* @param operation 需要执行的操作
* @param maxRetries 最大重试次数
* @param retryDelay 每次重试的延迟时间
* @param <T> 返回类型
* @return 如果成功返回操作结果,否则抛出异常
*/
public static <T> T executeWithRetry(Supplier<T> operation, int maxRetries, int retryDelay) {
for (int i = 0; i <= maxRetries; i++) {
try {
return operation.get();
} catch (Exception e) {
if (i == maxRetries || !shouldRetry(e)) {
throw new RuntimeException("Failed after " + i + " retries", e);
}
System.out.println("Retrying in " + retryDelay + " seconds...");
TimeUnit.SECONDS.sleep(retryDelay);
}
}
throw new IllegalStateException("All retries exhausted");
}
// 这里可以根据实际需求实现是否应该重试的判断逻辑,比如检查异常是否特定类型、是否有网络错误等
private static boolean shouldRetry(Exception e) {
// 默认情况总是尝试
return true;
}
// 示例:使用工具类执行可能会失败的操作
public static void main(String[] args) {
String result = RetryUtil.executeWithRetry(() -> {
// 这里模拟一个可能失败的操作,例如数据库查询
throw new SQLException("Connection error");
}, DEFAULT_MAX_RETRIES, DEFAULT_RETRY_DELAY);
System.out.println("Result: " + result);
}
}
```