当前位置:主页 > java教程 > Spring Retry实现原理知识点

Spring Retry实现原理及实例

发布:2019-06-07 14:32:31 174


本站收集了一篇相关的编程文章,网友暨雯琴根据主题投稿了本篇教程内容,涉及到Spring、Retry、原理、实例、Spring Retry实现原理知识点相关内容,已被937网友关注,内容中涉及的知识点可以在下方直接下载获取。

Spring Retry实现原理知识点

在前面这篇博客中介绍了Spring Retry的使用,本文通过一个简单的例子演示Spring Retry的实现原理,例子中定义的注解只包含重试次数属性,实际上Spring Retry中注解可设置属性要多的多,单纯为了讲解原理,所以弄简单点,关于Spring Retry可查阅相关文档、博客。

注解定义

package retry.annotation;

import java.lang.annotation.*;

/**
 * Created by Jack.wu on 2016/9/30.
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Retryable {

  int maxAttemps() default 0;

}

代理实现

以Cglib作为代理工具,先来写个Callback实现,这也是重试的实现的核心逻辑

package retry.interceptor;

import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import retry.annotation.Retryable;

import java.lang.reflect.Method;

/**
 * Created by Jack.wu on 2016/9/30.
 */
public class AnnotationAwareRetryOperationsInterceptor implements MethodInterceptor{

  //记录重试次数
  private int times = 0;

  @Override
  public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
    //获取拦截的方法中的Retryable注解
    Retryable retryable = method.getAnnotation(Retryable.class);
    if(retryable == null){
      return proxy.invokeSuper(obj,args);
    }else{ //有Retryable注解,加入异常重试逻辑
      int maxAttemps = retryable.maxAttemps();
      try {
        return proxy.invokeSuper(obj,args);
      } catch (Throwable e) {
        if(times++ == maxAttemps){
          System.out.println("已达最大重试次数:" + maxAttemps + ",不再重试!");
        }else{
          System.out.println("调用" + method.getName() + "方法异常,开始第" + times +"次重试。。。");
          //注意这里不是invokeSuper方法,invokeSuper会退出当前interceptor的处理
          proxy.invoke(obj,args);
        }
      }
    }
    return null;
  }
}

然后是写个代理类,使用AnnotationAwareRetryOperationsInterceptor作为拦截器

package retry.core;
import net.sf.cglib.proxy.Enhancer;
import retry.interceptor.AnnotationAwareRetryOperationsInterceptor;

/**
 * Created by Jack.wu on 2016/9/30.
 */
public class SpringRetryProxy {

  public Object newProxyInstance(Object target){
    Enhancer enhancer = new Enhancer();
    enhancer.setSuperclass(target.getClass());
    enhancer.setCallback(new AnnotationAwareRetryOperationsInterceptor());
    return enhancer.create();
  }
}

 测试

通过一个用户相关的业务方法来测试上面的代码

接口定义:

package facade;

/**
 * Created by Jack.wu on 2016/9/26.
 */
public interface UserFacade {

  void add() throws Exception;

  void query() throws Exception;
}

接口实现:package facade.impl;

import facade.UserFacade;
import retry.annotation.Retryable;
/**
 * Created by Jack.wu on 2016/9/26.
 */
public class UserFacadeImpl implements UserFacade {
  @Override
  public void add() throws Exception {
    System.out.println("添加用户。。。");
    throw new RuntimeException();
  }

  @Override
  @Retryable(maxAttemps = 3)
  public void query() {
    System.out.println("查询用户。。。");
    throw new RuntimeException();
  }
}

测试:

public class Main {

  public static void main(String[] args) throws Exception{
    UserFacadeImpl user = new UserFacadeImpl();
    //SpringRetry代理测试
    SpringRetryProxy springRetryProxy = new SpringRetryProxy();
    UserFacade u = (UserFacade)springRetryProxy.newProxyInstance(user);
    //u.add();//失败不重试
    u.query();//失败重试
  }
}

add方法不添加重试注解,程序异常结束,query方法添加重试注解,设置重试3次,运行效果如下

详解Spring Retry实现原理


参考资料

相关文章

  • 详解SpringMVC注解@initbinder解决类型转换问题

    发布:2022-06-17

    给大家整理了关于Spring MVC的教程,本篇文章主要介绍了详解SpringMVC注解@initbinder解决类型转换问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧


  • Python中职责链模式原理与用法详解

    发布:2019-11-22

    这篇文章主要介绍了Python设计模式之职责链模式,结合具体实例形式分析了Python责任链模式的概念、原理、定义与使用方法,需要的朋友可以参考下


  • SpringBoot多controller添加URL前缀的实现方法

    发布:2023-04-02

    这篇文章主要介绍了SpringBoot多controller添加URL前缀的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下


  • ThreadLocal的set方法原理示例解析

    发布:2023-03-29

    这篇文章主要为大家介绍了ThreadLocal的set方法原理示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪


  • SpringMVC框架post提交数据库出现乱码解决方案

    SpringMVC框架post提交数据库出现乱码解决方案

    发布:2022-11-07

    给大家整理一篇关于Spring MVC的教程,这篇文章主要介绍了SpringMVC框架post提交数据库出现乱码解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下


  • java Semaphore共享锁实现原理解析

    发布:2023-03-03

    这篇文章主要为大家介绍了Semaphore共享锁实现原理解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪


  • Spring钩子接口汇总分析使用示例

    发布:2023-03-05

    Spring提供了非常多的扩展接口,官方将这些接口称之为钩子,这些钩子会在特定的时间被回调,以此来增强Spring功能,众多优秀的框架也是通过扩展这些接口,来实现自身特定的功能,如SpringBoot、mybatis等


  • SpringBoot自动装配之@Enable深入讲解

    发布:2023-03-12

    这篇文章主要介绍了SpringBoot自动装配之@Enable,SpringBoot中提供了很多Enable开头的注解,这些注解都是用于动态启用某些功能的。而其底层原理是使用@Import注 解导入一些配置类,实现Bean的动态加载


网友讨论