`
kanpiaoxue
  • 浏览: 1781239 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

spring-retry简单包装工具类

 
阅读更多

工具类:

import org.springframework.retry.RecoveryCallback;
import org.springframework.retry.RetryCallback;
import org.springframework.retry.RetryPolicy;
import org.springframework.retry.backoff.BackOffPolicy;
import org.springframework.retry.backoff.FixedBackOffPolicy;
import org.springframework.retry.policy.SimpleRetryPolicy;
import org.springframework.retry.support.RetryTemplate;

import com.google.common.base.Preconditions;

/**
 * @ClassName: RetryUtils
 * @author kanpiaoxue
 * @version 1.0
 * @CreateTime: 2019/02/01 15:54:15
 * @Description: 重试工具类
 */
public class RetryUtils {

    /**
     * 创建重试模板
     *
     * @param retryPolicy
     *            重试策略
     * @param backOffPolicy
     *            延迟策略
     * @return 重试模板
     * @author kanpiaoxue
     * @CreateTime: 2019/02/01 16:23:00
     */
    public static RetryTemplate createRetryTemplate(RetryPolicy retryPolicy, BackOffPolicy backOffPolicy) {
        Preconditions.checkNotNull(retryPolicy, "retryPolicy is null");
        Preconditions.checkNotNull(backOffPolicy, "backOffPolicy is null");
        RetryTemplate template = new RetryTemplate();
        template.setRetryPolicy(retryPolicy);
        template.setBackOffPolicy(backOffPolicy);
        return template;
    }

    /**
     * 创建重试模板
     *
     * @param maxAttempts
     *            最大尝试次数
     * @param backOffPeriod
     *            延迟毫秒数
     * @return 重试模板
     * @author kanpiaoxue
     * @CreateTime: 2019/02/01 16:23:48
     */
    public static RetryTemplate createSimpleRetryTemplate(int maxAttempts, long backOffPeriod) {
        Preconditions.checkArgument(maxAttempts >= 1, "maxAttempts must be greate than 1");
        Preconditions.checkArgument(backOffPeriod >= 1, "backOffPeriod must be greate than 1");
        // 重试策略
        SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
        retryPolicy.setMaxAttempts(maxAttempts);
        // 设置间隔策略
        FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy();
        backOffPolicy.setBackOffPeriod(backOffPeriod);
        // 初始化重试模板
        RetryTemplate template = createRetryTemplate(retryPolicy, backOffPolicy);
        return template;
    }

    /**
     * 使用重试策略执行方法
     *
     * @param maxAttempts
     *            最大尝试次数
     * @param backOffPeriod
     *            延迟毫秒数
     * @param retryCallback
     *            重试的方法回调函数
     * @return 正常执行方法的返回值
     * @throws E
     * @author kanpiaoxue
     * @CreateTime: 2019/02/01 16:24:25
     */
    public static <T, E extends Throwable> T execute(int maxAttempts, long backOffPeriod,
            RetryCallback<T, E> retryCallback) throws E {
        Preconditions.checkNotNull(retryCallback, "retryCallback is null");
        RetryTemplate template = createSimpleRetryTemplate(maxAttempts, backOffPeriod);
        return template.execute(retryCallback);
    }

    /**
     *
     * 使用重试策略执行方法
     *
     * @param maxAttempts
     *            最大尝试次数
     * @param backOffPeriod
     *            延迟毫秒数
     * @param retryCallback
     *            重试的方法回调函数
     * @param recoveryCallback
     *            重试失败之后覆盖回调函数
     * @return 正常执行方法的返回值
     * @throws E
     * @author kanpiaoxue
     * @CreateTime: 2019/02/01 16:25:41
     */
    public static <T, E extends Throwable> T execute(int maxAttempts, long backOffPeriod,
            RetryCallback<T, E> retryCallback, RecoveryCallback<T> recoveryCallback) throws E {
        Preconditions.checkNotNull(retryCallback, "retryCallback is null");
        Preconditions.checkNotNull(recoveryCallback, "recoveryCallback is null");
        RetryTemplate template = createSimpleRetryTemplate(maxAttempts, backOffPeriod);
        return template.execute(retryCallback, recoveryCallback);
    }

    /**
     * 私有化构造函数,防止被初始化
     */
    private RetryUtils() {
        super();
    }

}

 

示例代码:

import org.kanpiaoxue.springExample.retry.utils.RetryUtils;
import org.springframework.retry.backoff.FixedBackOffPolicy;
import org.springframework.retry.policy.SimpleRetryPolicy;
import org.springframework.retry.support.RetryTemplate;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @ClassName: RetryExample
 * @author kanpiaoxue
 * @version 1.0
 * @CreateTime: 2019/02/01 14:59:30
 */
public class RetryExample {

    /**
     *
     * @param args
     * @author kanpiaoxue
     * @throws Exception
     * @CreateTime: 2019/02/01 14:59:31
     */
    public static void main(String[] args) throws Exception {

        retry0();
        retry1();
        retry2();
        retry3();
    }

    public static void retry3() {

        AtomicInteger count = new AtomicInteger();
        String result = RetryUtils.execute(5, 3000L, context -> {

            System.out.println("TestAll.main() " + count.incrementAndGet());
            throw new IllegalArgumentException();
        });
        System.out.println("result:" + result);
    }
    
    public static void retry2() {
        
        // 初始化重试模板
        RetryTemplate template = RetryUtils.createSimpleRetryTemplate(5, 3000L);
        
        AtomicInteger count = new AtomicInteger();
        String result = template.execute(context -> {
            
            System.out.println("TestAll.main() " + count.incrementAndGet());
            throw new IllegalArgumentException();
        });
        
        System.out.println("result:" + result);
    }
    

    public static void retry1() {

        // 重试策略
        SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
        retryPolicy.setMaxAttempts(5);

        // 设置间隔策略
        FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy();
        backOffPolicy.setBackOffPeriod(1000L);

        // 初始化重试模板
        RetryTemplate template = new RetryTemplate();
        template.setRetryPolicy(retryPolicy);
        template.setBackOffPolicy(backOffPolicy);

        AtomicInteger count = new AtomicInteger();

        String result = template.execute(context -> {

            System.out.println("TestAll.main() " + count.incrementAndGet());
            throw new IllegalArgumentException();
        }, context -> {
            System.out.println("TestAll.main() recover");
            return "world";
        });
        System.out.println("result:" + result);
    }
    
    public static void retry0() {
        
        AtomicInteger count = new AtomicInteger();
        String result = RetryUtils.execute(5, 3000L, context -> {

            System.out.println("TestAll.main() " + count.incrementAndGet());
            throw new IllegalArgumentException();
        }, context -> {
            System.out.println("TestAll.main() recover");
            return "world";
        });
        System.out.println("result:" + result);
    }

}

 

 

 

 

分享到:
评论

相关推荐

    springboot基于spring-retry实现重试机制

    Spring Retry 为开发者提供了一套强大的工具,使得在 Spring Boot 应用中实现重试逻辑变得简单。结合适当的配置和业务逻辑,我们可以有效地处理网络抖动、服务不稳定等问题,提升系统的整体性能。

    spring-retry:使用spring-retry项目的例子

    在Java开发中,特别是在分布式系统、网络调用或数据库操作等可能出现临时性错误的情景下,Spring Retry是一个非常实用的工具。 在Spring Retry项目中,主要涉及以下几个核心概念和功能: 1. **RetryTemplate**: 这...

    spring整合rabbitmq需要的jar包(spring版本4.2.0)

    这个库包含了Spring AMQP项目的核心功能,如连接工厂、模板类、监听容器等,使得开发者能够方便地在Spring应用中发送和接收消息。 2. **spring-amqp-1.5.1.RELEASE.jar**:这是Spring AMQP项目的主要库,它提供了...

    grpc-spring-boot-starter源码,可以学习下spring的starter怎么来实现

    5. **熔断和重试(Circuit Breaker & Retry)**:借助Spring的Hystrix或Resilience4J,Starter可以实现gRPC客户端的熔断和重试策略,增强系统的健壮性。 6. **监控和日志(Monitoring & Logging)**:gRPC-Spring-...

    rabbitmq 所需jar包

    在`spring-amqp`中,你可以使用`RabbitTemplate`作为主要的工具类,它封装了发送和接收消息的方法,支持各种消息模式,如简单、Direct、Topic、Fanout等。此外,`AmqpAdmin`接口提供了声明交换机、队列和绑定的功能...

    spring-cloud.docx

    Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具集,它为开发者提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态)...

    spring-boot集成RabbitMQ

    Spring AMQP 提供了许多高级特性,如 DLQ(Dead Letter Queue)、TTL(Time To Live)、Retry Policy 和 Confirm/CNACK 机制等,可以根据实际需求进行配置和使用。 通过以上步骤,你就成功地在 Spring Boot 项目中...

    spring-amqp:春天

    本文将详细探讨Spring AMQP的原理、使用方法以及实战技巧,帮助读者全面掌握这一强大的工具。 首先,我们需要了解什么是Spring AMQP。Spring AMQP是Spring框架的一个模块,它提供了与Advanced Message Queuing ...

    关于consul的单机部署与集群

    - 需要定义服务接口及其实现类,并使用`@EnableDiscoveryClient`注解使Spring Cloud能够自动注册服务到Consul。 - **服务消费者** (`consul-test-client`): - 可以通过`RestTemplate`或者`Feign`来实现对服务提供...

    spring cloud 入门操作手册(全).pdf

    - **commons通用项目**:包含公共组件、工具类等。 - **Itemservice商品服务**:处理商品相关的逻辑。 - **Userservice用户服务**:处理用户相关的逻辑。 - **Orderservice订单服务**:处理订单相关的逻辑。 ##...

    SSE使用方式记录(自己做的PPT)

    对于IE浏览器,可以通过使用`event-source-polyfill`这类工具来实现对SSE的支持。不同版本浏览器的具体支持情况可通过访问[caniuse.com](https://caniuse.com/?search=server-sent%20events)进行查询。 #### SSE...

    基于dubbo的服务方完整项目示例

    - 在服务提供者的Spring配置文件(如`beans.xml`)中,使用`&lt;dubbo:service&gt;`标签定义服务,指定接口、实现类以及其它属性,如版本、协议、分组等。 5. **注册中心配置** - Dubbo支持多种注册中心,如Zookeeper、...

    dangdang-dubbox:dubbox 源码解析

    Dubbox,作为一款基于Spring的RPC框架,由当当网开源,是Java开发者们在构建分布式系统时常常选用的工具。它不仅集成了Apache的Dubbo,还包含了更多的扩展功能,如RESTful支持、Hessian2协议等。本文将深入探讨...

    1000道 互联网Java工程师面试题 485页_PDF密码解除.pdf

    - **区别:**全自动ORM工具更适合于简单模型的快速开发,而MyBatis更适合于复杂查询的需求。 **19. 一对一、一对多的关联查询?** - **一对一关联:**使用`&lt;association&gt;`标签进行一对一关联映射。 - **一对多关联...

    dubbo-debug:学习dubbo

    1. **源代码**:项目的核心代码,通常位于`src/main/java`目录下,包含了服务提供者和服务消费者的实现,以及可能的配置和工具类。 2. **配置文件**:Dubbo的配置通常在`src/main/resources`目录下的XML文件中,如`...

    dubbostudy.zip

    除了基本的RPC调用,Dubbo还提供了丰富的特性,如集群容错策略(Failover、Failfast、Failsafe、Fallback、Retry等),服务路由(根据不同的条件选择不同的服务实例进行调用),负载均衡(Random、RoundRobin、...

Global site tag (gtag.js) - Google Analytics