基于 Java Supplier与Predicate 封装自动重试机制通用接口

核心逻辑就是把重试的业务与重试中断条件抽象出来函数化,内部重试业务具体化。

关键需要理解Java的函数式接口编程 Supplier 与 Predicate作用。


import lombok.Data;
import lombok.extern.slf4j.Slf4j;

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

/**
 * @author zhe.xiao
 * @version 1.0
 * @since 2024/8/2 下午5:42
 */
@Slf4j
@Data
public class RetryComponent {
    // 重试次数
    private int retryCount = 3;

    // 重试间隔 ,单位秒
    private long retryGap = 2L;

    /**
     * 核心重试泛型函数
     *
     * @param supplier
     * @param predicate
     * @param <R>
     */
    public <R> void retry(Supplier<R> supplier, Predicate<R> predicate) {
        log.info("[RetryComponent] init, retryCount={}, retryGap={}s", retryCount, retryGap);

        int execCount = 0;
        while (execCount < retryCount) {
            // 执行次数+1
            execCount += 1;

            // 执行业务,获取返回值
            R resp = supplier.get();
            log.info("[RetryComponent] supplier run, execCount={}, resp={}", execCount, resp);

            // 如果满足条件,则跳出循环
            if (predicate.test(resp)) {
                log.info("[RetryComponent] supplier break, execCount={}, resp={}", execCount, resp);
                break;
            }

            // 休眠
            try {
                Thread.sleep(retryGap * 1000);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                log.error("[RetryComponent] sleep error", e);
            }
        }

        log.info("[RetryComponent] retry end execCount={}", execCount);
    }


    public static void main(String[] args) {
        int a = 10;
        int b = 20;

        // 重试业务
        Supplier<Boolean> supplierLogic = () -> {
            int c = a + b;
            int i = new Random().nextInt(50);

            System.out.println("i=" + i);
            return i > c;
        };

        // 重试中断条件
        Predicate<Boolean> supplierPredict = (e) -> Boolean.TRUE.equals(e);

        RetryComponent retryComponent = new RetryComponent();
        retryComponent.retry(supplierLogic, supplierPredict);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值