012 spring retry重试原理的解析
时间:2019-08-23
本文章向大家介绍012 spring retry重试原理的解析,主要包括012 spring retry重试原理的解析使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
有点复杂,在后续的章节,将会对其中涉及到的知识点,再分章节进行说明。
1.程序结构
2.@Retryable
package com.jun.web.annotation.theory; import java.lang.annotation.*; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Retryable { int maxAttemps() default 0; }
3.RetryService
package com.jun.web.annotation.theory; public interface RetryServcie { void testRetry(); }
4.RetryServiceImpl
package com.jun.web.annotation.theory; public class RetryServcieImpl implements RetryServcie { private int count=5; @Override @Retryable(maxAttemps = 5) public void testRetry() { System.out.println("这是第"+count+"执行方法"); throw new RuntimeException(); } }
5.拦截器
MethodInterceptor接口被用来拦截指定的方法,对方法进行增强
具体的是哪个方法,将会通过Enhancer说明
package com.jun.web.annotation.theory; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy; import java.lang.reflect.Method; //MethodInterceptor接口被用来拦截指定的方法,对方法进行增强 public class AnnotationRetryInterceptor implements MethodInterceptor { private int times=0; @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { //obj是代理后的子类 ,method是调用方法 ,args是方法入参 , proxy是MethodProxy代理对象 //获取拦截方法中的注解 Retryable retryable = method.getAnnotation(Retryable.class); if(retryable==null){ return methodProxy.invokeSuper(o, objects); }else{ int maxAttemps = retryable.maxAttemps(); try { return methodProxy.invokeSuper(o,objects); }catch (Throwable t){ if (times++ == maxAttemps){ System.out.println("已经达到最大值:"+times); }else { System.out.println("调用"+method.getName()+"方法异常,开始第"+times+"次重试"); methodProxy.invoke(o,objects); } } } return null; } }
6.代理
package com.jun.web.annotation.theory; import org.springframework.cglib.proxy.Enhancer; public class RetryProxy { public Object newProxyInstance(Object target){ Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(target.getClass()); enhancer.setCallback(new AnnotationRetryInterceptor()); return enhancer.create(); } }
7.测试
package com.jun.web.annotation.theory; public class RetryHandler { public static void main(String[] args) { RetryServcieImpl retryServcieImpl = new RetryServcieImpl(); RetryProxy retryProxy = new RetryProxy(); // RetryServcie retryServcie = (RetryServcie) retryProxy.newProxyInstance(retryServcieImpl); retryServcie.testRetry(); } }
8.效果
Connected to the target VM, address: '127.0.0.1:59161', transport: 'socket' 这是第5执行方法 调用testRetry方法异常,开始第1次重试 这是第5执行方法 调用testRetry方法异常,开始第2次重试 这是第5执行方法 调用testRetry方法异常,开始第3次重试 这是第5执行方法 调用testRetry方法异常,开始第4次重试 这是第5执行方法 调用testRetry方法异常,开始第5次重试 这是第5执行方法 已经达到最大值:6 Disconnected from the target VM, address: '127.0.0.1:59161', transport: 'socket'
原文地址:https://www.cnblogs.com/juncaoit/p/11399991.html
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 建议收藏 哭着喊着 从C语言转向C++刷算法
- Spring的事务管理
- 面向切面的Spring
- 搭建ELK日志分析平台(下)—— 搭建kibana和logstash服务器
- Spring对JDBC的模板支持——JdbcTemplate
- 搭建ELK日志分析平台(上)—— ELK介绍及搭建 Elasticsearch 分布式集群
- Hadoop集成Spring的使用
- 通过Jenkins部署java项目
- Spring使用注解配置依赖注入
- Spring的依赖注入
- 通过Jenkins发布php代码
- 初识Spring
- 使用Python的BeautifulSoup库实现一个可以爬取1000条百度百科数据的爬虫
- 初识Spark
- 初识SpringBoot