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");

}

SpringAOPでこれをどのように達成できますか。1つの解決策は、ファイルからmaxtimeを読み取ることです。何かご意見は?

4

2 に答える 2

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 に答える
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 に答える