自动重试的最简写法

自动重试的最简写法(java8)

无需引入 框架的最简写法
支持设置重试次数

工具类

import cn.hutool.core.map.MapUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.LinkedCaseInsensitiveMap;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Supplier;

/**
 * 简单实用的自动重试机制,java8 写法 通用工具类
 * required: JDK8, hutool-util ,lombok
 *
 * @author stormfeng
 * @date 2023-06-02  14:23
 *
 * @see `引入其他框架较复杂的用法,暂时不需要 https://juejin.cn/post/6844903910805602312`
 */
@Slf4j
public class RetryUtils {

    /**
     * 测试入口
     */
    public static void main(String[] args) {
        Integer retry = retry(100, () -> 1  / 1);
        log.info("retry:{}",retry);

        Map<Object, Object> map = new HashMap<>();
        RetryUtils.retry(() -> getResponse(new LinkedCaseInsensitiveMap() {{
            putAll(map); // 重置 offset 分页等参数 后再次 从头重跑
        }}, new ArrayList()));


        retry = retry(100, () -> 1 / 0);
        log.info("retry:{}",retry);
    }

    /**
     * 通用工具类:默认 20次
     */
    public static <T> T retry(int times, Supplier<T> supplier) {
        if (times < 0 || times >= 100) {
            times = 20;
        }

        for (int i = 0; i < times; i++) {
            try {
                return supplier.get();
            } catch (Exception e) {
                log.warn("{},重试第 {} 次", e.getMessage(), i + 1);
            }
        }

        throw new RuntimeException("重试次数耗尽 "+times);
    }

    /**
     * 通用工具类:默认 20次
     */
    public static <T> T retry(Supplier<T> supplier) {
        return retry(20, supplier);
    }

    /**
     * 模拟分页查询
     */
    private static List getResponse(Map map, List result) {
        final Integer limit = MapUtil.getInt(map, "limit", 100), offset = MapUtil.getInt(map, "offset", 0);
        result.add(offset);

        map.put("offset", offset + limit);

        if (MapUtil.getInt(map, "offset") <= 300) {
            return getResponse(map, result);
        }

        //模拟报错
        if (offset <= 300) {
            int aa = 1 / 0;
        }

        return result;
    }
}

调用示例

// 1 默认次数
Integer retry = retry(() -> 1  / 1);
// 2 指定重试100次
retry = retry(100, () -> 1 / 0);
// 3 
Map<Object, Object> map = new HashMap<>();
RetryUtils.retry(() -> getResponse(new LinkedCaseInsensitiveMap() {{
    putAll(map); // 重置 offset 分页等参数 后再次 从头重跑
}}, new ArrayList()));

pom.xml jar包参考

<properties>
    <lombok.version>1.18.24lombok.version>
    <hutool-all.version>5.8.18hutool-all.version>
properties>

<dependencies>
    <dependency>
        <groupId>cn.hutoolgroupId>
        <artifactId>hutool-allartifactId>
        <version>${hutool-all.version}version>
    dependency>
   <dependency>
        <groupId>org.projectlombokgroupId>
        <artifactId>lombokartifactId>
        <version>${lombok.version}version>
    dependency>     
dependencies>

参考

引入框架,较复杂,暂不需要

你可能感兴趣的:(java,spring,retry,自动重试)