当前位置:网站首页 > Java基础 > 正文

Java基础语法没用



最近有一个小伙伴提了一个issues 指出@Retryable注解在接口上不生效 · Issue #I7VGS8 · aizuda/easy-retry - Gitee.com 首先我们复现issues问题.

问题复现

1. 新建一个接口并添加@Retryable注解

 

实现接口并执行一个异常的代码

 

2. 观察日志是否触发异常

通过观察日志并未触发重试

> 想要知道为什么会出现这个问题就得了解一下啊注解的继承问题?

# 注解的继承问题

经过测试得出以下结论

那为啥注解在接口上没作用?

Spring 的动态代理主要分为两种,一种是JDK 动态代理 ;一种是CGLIB 动态代理;

JDK 动态代理

JDK 动态代理主要是针对实现了某个接口的类。该方式基于反射的机制实现,会生成一个实现相同接口的代理类,然后通过对方法的充写,实现对代码的增强。

在该方式中接口中的注解无法被实现类继承,AOP 中的切点无法匹配上实现类,所以也就不会为实现类创建代理,所以我们使用的类其实是未被代理的原始类,自然也就不会被增强了。

CGLIB 动态代理

1. 不存在继承关系 AOP可进行有效拦截(CGLIB动态代理)

2. 存在继承关系 有父类和子类 ,切点注解在父类方法。若子类重写父类的方法将不会被拦截,而未重写的方法可以被AOP拦截。

解决方案

我们知道事务的注解@Transactional和Spring Retry的注解@Retryable都是支持在接口的方法和抽象类的方法上,不妨先学习一下他们是如何实现

先阅读一下Spring Retry的关于这块的源码

 

仿造Spring Retry实现对接口的注解进行拦截

新增EasyRetryPointcutAdvisor增强器

 

实现拦截器EasyRetryInterceptor

Java基础语法没用
  测试改造结果 

.从测试结果来看,效果还是很不错了,完美的解决了这个问题

一波小广告

EasyRetry是一款基于BASE思想实现的分布式服务重试组件,旨在通过重试机制确保数据的最终一致性。它提供了控制台任务观测、可配置的重试策略、重试后执行回调以及丰富地告警配置等功能。通过这些手段,可以对异常数据进行全面监测和回放,从而在确保系统高可用性的同时,大大提升数据的一致性

为了便于快速上手EasyRetry特别的录制了视频教程还在持续的录制中有兴趣可以看看。

视频地址:
https://www.easyretry.com/pages/a774e2/

版权声明


相关文章:

  • java基础类库怎么看2024-11-13 17:26:06
  • 谁有Java基础设计毕业项目2024-11-13 17:26:06
  • 张孝详java基础加强2024-11-13 17:26:06
  • java哈希表基础讲解2024-11-13 17:26:06
  • 黑马Java基础班考试2024-11-13 17:26:06
  • 有java基础学php难吗2024-11-13 17:26:06
  • java农村基础信息管理系统2024-11-13 17:26:06
  • java语言程序设计基础篇英文2024-11-13 17:26:06
  • 沈阳0基础java实习2024-11-13 17:26:06
  • java补充计算机基础知识2024-11-13 17:26:06