IT俱乐部 Java Java编写自定义重试工具类的示例代码

Java编写自定义重试工具类的示例代码

Java重试工具类,零依赖。可配置项:接受的异常类型、返回值校验、最大重试次数、重试间隔时间。

1 重试工具类 RetryUtils源码

RetryUtils:

使用了lombok的@Slf4j注解用于打印日志,不用可移除。

import com.example.exception.RetryException;

import lombok.extern.slf4j.Slf4j;

import java.util.function.Predicate;
import java.util.function.Supplier;

/**
 * 

重试工具类

* * @author GFire * @since 2025/4/22 17:58 */ @Slf4j public abstract class RetryUtils { /** * 失败重试 * * @param task 执行的任务,无返回值 * @param acceptException 可接受的异常类型,执行的任务抛出此异常(及其子类)则失败重试。null表示不接受任何异常 * @param maxRetryCount 最大重试次数 * @param waitTime 重试间隔等待时间, 单位毫秒, acceptException, int maxRetryCount, int waitTime) { if (task == null) { throw new IllegalArgumentException("task can not be null"); } doWithRetry(() -> { task.run(); return 1; }, i -> i == 1, acceptException, maxRetryCount, waitTime); } /** * 失败重试 * * @param task 执行的任务,有返回值 * @param isValid 判断任务返回值是否合法,不合法则失败重试 * @param acceptException 可接受的异常类型,执行的任务抛出此异常(及其子类)则失败重试。null表示不接受任何异常 * @param maxRetryCount 最大重试次数 * @param waitTime 重试间隔等待时间, 单位毫秒, T doWithRetry(Supplier task, Predicate isValid, Class extends Throwable> acceptException, int maxRetryCount, int waitTime) { if (task == null) { throw new IllegalArgumentException("task can not be null"); } if (isValid == null) { throw new IllegalArgumentException("isValid can not be null"); } if (maxRetryCount 0"); } T result = null; for (int tryCount = 1; tryCount 0 && tryCount acceptException, int maxRetryCount, int tryCount) { log.error("error, tryCount: {}, Exception: ", tryCount, e); if (acceptException != null && acceptException.isInstance(e)) { if (tryCount == maxRetryCount) { // 最后一次重试仍失败,则抛出 throw new RetryException(e); } } else { // 不可接受的异常,直接抛出 throw new RetryException(e); } } private static void sleep(int waitTime) { try { Thread.sleep(waitTime); } catch (InterruptedException e) { Thread.currentThread().interrupt(); throw new RetryException(e); } } }

RetryException:

/**
 * 

重试异常

* * @author GFire * @since 2025/4/23 11:20 */ public class RetryException extends RuntimeException { public RetryException(String message) { super(message); } public RetryException(Throwable cause) { super(cause); } }

2 使用方式

示例1:任务无返回值

 // 模拟调用API接口,失败重试
RetryUtils.doWithRetry(() -> apiService.query(), Exception.class, 3, 2000);

解释:任务apiService.query()无返回值、接受Exception异常、最大重试次数为3、重试间隔2秒

示例2:任务有返回值、需校验返回值

/**
 * 模拟发送通知
 */
public boolean send(String content) {
    try {
        RetryUtils.doWithRetry(() -> noticeService.send(content), this::isValid, Exception.class, 3, 2000);
        return true;
    } catch (RetryException e) {
        log.error("send error: {}", e.toString());
    }
    return false;
}

private boolean isValid(String res) {
    if (StringUtils.isNotEmpty(res)) {
        JSONObject response = JSON.parseObject(res);
        return "ok".equals(response.getString("status"));
    }
    return false;
}

解释:任务noticeService.send(content)有String类型的返回值、isValid方法判断返回值是否合法、接受Exception异常、最大重试次数为3、重试间隔2秒

示例3:任务有返回值、无需校验返回值

RetryUtils.doWithRetry(() -> noticeService.send(), (res) -> true, Exception.class, 3, 2000);

解释:任务noticeService.send()有String类型的返回值、(res) -> true认为任意返回值都合法(即无校验)、接受Exception异常、最大重试次数为3、重试间隔2秒

到此这篇关于Java编写自定义重试工具类的示例代码的文章就介绍到这了,更多相关Java自定义重试内容请搜索IT俱乐部以前的文章或继续浏览下面的相关文章希望大家以后多多支持IT俱乐部!

本文收集自网络,不代表IT俱乐部立场,转载请注明出处。https://www.2it.club/code/java/17224.html
上一篇
下一篇
联系我们

联系我们

在线咨询: QQ交谈

邮箱: 1120393934@qq.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部