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

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

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组件相比,它也是支持重试终止策略,重试间隔策略,重试监听器这些配置项的定义。

目录
相关文章
|
5月前
|
监控 中间件 Java
中间件失败重试机制
【7月更文挑战第21天】
65 7
|
4月前
|
Java 数据库 开发者
"揭秘!SpringBoot+事务钩子,如何携手打造零差错、秒级响应的高效支付系统,让你的业务飞起来!"
【8月更文挑战第11天】构建高效稳定的支付系统时,Spring Boot凭借其快速开发与丰富生态成为优选框架。通过集成Spring事务管理抽象,@Transactional注解简化了数据库事务处理。针对复杂业务,可利用`TransactionSynchronizationManager`和`TransactionSynchronization`接口自定义事务钩子函数,在事务不同阶段执行特定逻辑,如支付成功或失败时的通知,确保数据一致性与业务完整性。
102 4
|
5月前
|
设计模式 监控 Go
开发与运维C++问题之C++部分原有的数据发送能力如何解决
开发与运维C++问题之C++部分原有的数据发送能力如何解决
27 1
|
5月前
|
JavaScript 中间件
中间件重试机制
【7月更文挑战第20天】
49 1
|
消息中间件 Dubbo IDE
业务中台如何实现业务结果的回调通知
这个问题暂且不表。我们先来看跨企业通信的业务回调通知。
166 0
|
Java Spring 容器
如何落地一款重试组件(上)
如何落地一款重试组件(上)
219 0
|
消息中间件 存储 SQL
消息链路拆分最佳实践:钉钉审批异步链路重构【总结】
引入消息队列可以帮助我们解耦业务逻辑,提升性能,让主链路更加清晰。但是消息链路的代码腐化和一致性问题也给业务带来了很多困扰,本文阐述了钉钉审批消息链路重构的设计和解决方案。注:Metaq 是阿里 RocketMQ 消息队列的内网版本。
908 3
消息链路拆分最佳实践:钉钉审批异步链路重构【总结】
|
设计模式 缓存 架构师
【韧性设计】韧性设计模式:重试、回退、超时、断路器
【韧性设计】韧性设计模式:重试、回退、超时、断路器
|
消息中间件 存储 容灾
容灾方案:Retry 和 Fallback 该怎么抉择?(上)
容灾方案:Retry 和 Fallback 该怎么抉择?(上)
容灾方案:Retry 和 Fallback 该怎么抉择?(下)
容灾方案:Retry 和 Fallback 该怎么抉择?(下)