SnailRetryEndPoint无法被SnailEndPointScanner正常处理

Viewed 36

snail-job-bug.png

spring在进行aop增强的时候,会根据当前被代理类是否有实现接口来决定使用jdk代理方式,还是cglib方式;

这个地方因为SnailRetryEndPoint实现了Lifecycle接口,spring会使用jdk代理方式进行aop增强,那么SnailEndPointScanner.scanEndPoint方法中直接拿代理对象类去获取注解时候,是拿不到注解信息的,并且下面通过代理对象类获取

Map<Method,Mapping> annotatedMethods;

也一样是拿不到对应信息的;

我调试过程中,尝试使用TargetClass就没有问题:

 Class executorNotProxy = AopProxyUtils.ultimateTargetClass(bean);
4 Answers

我想是因为jdk的动态代理生成的类里面本身除了object的方法之外,只有一个invoke方法,这个invoke方法里面通过反射技术调用target对象的方法以此实现的动态代理;因此直接从jdk的动态代理生成类上获取注解信息和方法信息,应该是获取不到的,因为代理类没有这些信息;反观cglib是通过继承方式进行生成代理类,那么cglib的代理类是有目标类所有方法签名和那些可继承注解的信息的;

@官方 望snail-job的维护大佬们采纳

以上问题在snail-job的1.6.0版本中存在

你的SpringBoot的版本?

这个应该和SpringBoot的版本,我回头试试3.5.3.
目前我们的版本是
3.3.10