-1

我试图在一个方面类中实现弹性逻辑,类似于日志记录的实现方式。下面是我一直在尝试的一段代码,但它不起作用。

  @Pointcut("within(com.example.demo.*)")
   public void myPointCut() {

  }
  @Around("myPointCut()")
  public String addfaultToleranceRateLimiter(ProceedingJoinPoint pj) throws 
  Throwable,IllegalAccessException,InvocationTargetException {
     String result = applyRLtolerance(pj);
     return result;
  }
  @RateLimiter(name="service1",fallbackMethod = "fallbackRL")
  private String applyRLtolerance(ProceedingJoinPoint pj) throws Throwable {
    String result = (String) pj.proceed();
    return result;
  }

 public String fallbackRL(Throwable t) {
        System.out.println("in fallback" + new Date());
        return "bye";
      }

当调用 pj.proceed() 时,实际的逻辑被执行,但 @ratelimiter 注释似乎不起作用,因为执行的调用次数没有根据 application.yml 文件中给出的配置受到限制。

4

2 回答 2

0

如果您在同一个类中调用带注释的方法,则大多数注释都是使用 AOP 处理的,而注释将不起作用。当多个方面满足执行条件时,AOP 也会出现顺序问题。

在您的情况下,您正在从同一个类调用该方法,因此注释无效。您可以通过将速率限制器相关的方法移动到另一个类来解决这个问题。

class MyAspect{
   RateLimiterSercvice rls = new RateLimiterSercvice();
   @Pointcut("within(com.example.demo.*)")
   public void myPointCut() {

   }
   @Around("myPointCut()")
   public String addfaultToleranceRateLimiter(ProceedingJoinPoint pj) throws 
    Throwable,IllegalAccessException,InvocationTargetException {
     String result = rls.applyRLtolerance(pj);
     return result;
  }
}


class RateLimiterService {
  @RateLimiter(name="service1",fallbackMethod = "fallbackRL")
  public String applyRLtolerance(ProceedingJoinPoint pj) throws Throwable {
    String result = (String) pj.proceed();
    return result;
  }
  public String fallbackRL(Throwable t) {
        System.out.println("in fallback" + new Date());
        return "bye";
  }
}




于 2020-06-14T06:41:05.167 回答
0

您需要将包装器类配置为 spring bean 并在Aspect.

由于以下原因,该代码无法正常工作。

  1. 当使用关键字创建实例时new,它不是 Spring 托管 bean。
  2. Spring AOP 不能拦截/通知内部方法调用。

以下代码有效

@Aspect
@Component
public class ResilienceAspect {

    @Autowired
    ResilienceWrapper wrapper;

    @Pointcut("within(com.example.demo.*)")
    public void myPointCut() {

    }

    @Around("myPointCut()")
    public String addfaultToleranceRateLimiter(ProceedingJoinPoint pj)
            throws Throwable, IllegalAccessException, InvocationTargetException {
        String result = wrapper.applyRLtolerance(pj);
        return result;
    }
}

包装器

@Component
public class ResilienceWrapper {

    @RateLimiter(name = "service1", fallbackMethod = "fallbackRL")
    public String applyRLtolerance(ProceedingJoinPoint pj) throws Throwable {
        String result = (String) pj.proceed();
        return result;
    }

    public String fallbackRL(Throwable t) {
        System.out.println("in fallback" + new Date());
        return "bye";
    }
}

请注意 :

within(com.example.demo.*)可以进行调整,使其不会干扰 Aspect 代码。如果ResilienceAspect也在 范围内com.example.demo,则运行将产生不希望的结果。

希望这可以帮助。

于 2020-06-17T02:09:37.573 回答