如何落地一款重试组件(下)

简介: 如何落地一款重试组件(下)

Guava-Retry组件


基于guava的重试组件,这款组件的功能相比于Spring要更加完善和丰富,但是在接入到Spring当中可能会对代码造成一定的侵入性:


首先是引入相关的依赖配置:


<dependency>
    <groupId>com.github.rholder</groupId>
    <artifactId>guava-retrying</artifactId>
    <version>2.0.0</version>
</dependency>
复制代码


然后是具体的使用累代码:


package org.idea.qiyu.framework.retry.guava;
import com.github.rholder.retry.*;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
/**
 * @Author linhao
 * @Date created in 9:18 上午 2021/10/4
 */
public class Application {
    static class ResponseInfo {
        int code;
        public int getCode() {
            return code;
        }
        public void setCode(int code) {
            this.code = code;
        }
        public ResponseInfo() {
        }
        public static ResponseInfo buildSuccess(){
            ResponseInfo responseInfo = new ResponseInfo();
            responseInfo.setCode(1);
            return responseInfo;
        }
    }
    public static void main(String[] args) throws ExecutionException, RetryException {
        Callable<ResponseInfo> callable = new Callable<ResponseInfo>() {
            @Override
            public ResponseInfo call() throws Exception {
                System.out.println("call ...");
                return ResponseInfo.buildSuccess();
            }
        };
        Retryer<ResponseInfo> retryer = RetryerBuilder.<ResponseInfo>newBuilder()
                .retryIfResult(expectResult-> expectResult.getCode()==1)
                .retryIfException()
                .withStopStrategy(StopStrategies.stopAfterAttempt(3))
                .withWaitStrategy(WaitStrategies.fixedWait(1, TimeUnit.SECONDS))
                .withRetryListener(new MyRetryListener())
                .build();
        retryer.call(callable);
    }
}
复制代码


监听器部分代码:


package org.idea.qiyu.framework.retry.guava;
import com.github.rholder.retry.Attempt;
import com.github.rholder.retry.RetryListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
 * @Author linhao
 * @Date created in 9:35 上午 2021/10/4
 */
public class MyRetryListener implements RetryListener {
    private static final Logger LOGGER = LoggerFactory.getLogger(MyRetryListener.class);
    @Override
    public <V> void onRetry(Attempt<V> attempt) {
        // 第几次重试(注意:第一次重试其实是第一次调用)
        System.out.printf("retry time : %s \n", attempt.getAttemptNumber());
        // 距离第一次重试的延迟
        System.out.printf("retry delay : %s  \n", attempt.getDelaySinceFirstAttempt());
        // 是否因异常终止
        if (attempt.hasException()) {
            System.out.printf("causeBy: %s  \n", attempt.getExceptionCause());
        }
        // 正常返回时的结果
        if (attempt.hasResult()) {
            System.out.printf("result=%s  \n", attempt.getResult());
        }
    }
}
复制代码


这段代码中的retryIfResult是我比较喜欢的一个功能,可以根据自定义的返回尸体对象来决定是否后续需要执行重试的操作,感觉相比于Spring组件会更加灵活。

和Spring的Retry组件相比,它也是支持重试终止策略,重试间隔策略,重试监听器这些配置项的定义。

目录
相关文章
|
4月前
|
监控 中间件 Java
中间件失败重试机制
【7月更文挑战第21天】
57 7
|
3月前
|
缓存 容灾
钉钉发展与优化迭代问题之当钉钉的路由服务出现异常时,路由的可用性如何保障
钉钉发展与优化迭代问题之当钉钉的路由服务出现异常时,路由的可用性如何保障
|
13天前
|
监控 Java 微服务
微服务调用失败时常用处理手段
【10月更文挑战第27天】在微服务架构中,服务调用面临诸多不确定性,如服务提供者的硬件故障、网络问题等。因此,需要采取超时、重试、双发和熔断等策略来确保服务的稳定性和可靠性。超时机制避免长时间等待,重试机制应对偶发错误,双发机制提高成功率,熔断机制防止故障扩散。这些策略共同作用,保障了系统的高可用性。
|
3月前
|
Java 数据库 开发者
"揭秘!SpringBoot+事务钩子,如何携手打造零差错、秒级响应的高效支付系统,让你的业务飞起来!"
【8月更文挑战第11天】构建高效稳定的支付系统时,Spring Boot凭借其快速开发与丰富生态成为优选框架。通过集成Spring事务管理抽象,@Transactional注解简化了数据库事务处理。针对复杂业务,可利用`TransactionSynchronizationManager`和`TransactionSynchronization`接口自定义事务钩子函数,在事务不同阶段执行特定逻辑,如支付成功或失败时的通知,确保数据一致性与业务完整性。
92 4
|
4月前
|
JavaScript 中间件
中间件重试机制
【7月更文挑战第20天】
46 1
|
3月前
|
存储 边缘计算 缓存
钉钉发展与优化迭代问题之钉钉每次消息发送都要查询路由服务带来的压力如何解决
钉钉发展与优化迭代问题之钉钉每次消息发送都要查询路由服务带来的压力如何解决
|
6月前
|
消息中间件 监控 Java
接口请求重试策略:保障稳定性的必杀技
接口请求重试策略:保障稳定性的必杀技
323 0
|
消息中间件 Dubbo IDE
业务中台如何实现业务结果的回调通知
这个问题暂且不表。我们先来看跨企业通信的业务回调通知。
156 0
|
6月前
|
监控 NoSQL 关系型数据库
Serverless 应用引擎常见问题之现象上是注册中心业务模块掉线了如何解决
Serverless 应用引擎(Serverless Application Engine, SAE)是一种完全托管的应用平台,它允许开发者无需管理服务器即可构建和部署应用。以下是Serverless 应用引擎使用过程中的一些常见问题及其答案的汇总:
|
Java Spring 容器
如何落地一款重试组件(上)
如何落地一款重试组件(上)
213 0