2

我需要确保特定方法的执行时间小于指定值。我想做一些类似以下的事情

@Around("execution(* com.foo.bar.executeTask2(..))" + " && someExternalParams(500)")
@Around("execution(* com.foo.bar.executeTask(..))" + " && someExternalParams(5)")
public void checkSLA(ProceedingJoinPoint joinPoint, int maxtime) throws Throwable {

//get staarttime
joinPoint.proceed();
// get endtime

if(endtime - starttime > maxtime)
  System.out.println("Task took longertime");

}

如何使用 Spring AOP 实现这一点。一种解决方案是从文件中读取最大时间。有什么想法吗?

4

2 回答 2

1

嗨,您可以@SLA在您的方面进行注释并从中读取该值。您显然必须更改建议以匹配该注释并用@SLA注释标记您的所有方法。

它与您的方法有点不同,但我认为为这种方面进行注释会更好。这样,您不必每次要处理新方法时都更新切入点。只需为此方法添加注释即可。请参见下面的示例。

注解:

@Target(METHOD)
@Retention(RUNTIME)
public @interface SLA {
    int maxtime();
}

方面:

@Aspect
public SLAAscpet {
    @Around("execution(@com.foo.bar.SLA * *(..))")
    public void aroundSLAMethod(final JoinPoint joinPoint) {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        SLA annotation = signature.getMethod().getAnnotation(SLA.class)
        int maxtime = annotation.maxtime()
        ...
    }
}

用法:

...
@SLA(maxtime=500)
public void someMethodForSLA() {
     ...
}
...
于 2013-02-04T21:11:56.487 回答
1

你的方面是 Spring 管理的,所以我会从我的方面 bean 中的属性中读取。

@Aspect
public class MyAspect {
    @Value("${my.system.property.for.max.time}")
    private int maxTime;

    @Around("execution(* com.foo.bar.executeTask(..))")
    public void checkSLA(ProceedingJoinPoint joinPoint) throws Throwable {

        //get staarttime
        joinPoint.proceed();
        // get endtime

        if(endtime - starttime > maxTime)
            System.out.println("Task took longertime");
        }
    }
}
于 2013-02-04T17:34:54.503 回答