2

为了测量方法的执行时间,我看到了使用建议

public class PerformanceInterceptor {
   @AroundInvoke
   Object measureTime(InvocationContext ctx) throws Exception {
   long beforeTime = System.currentTimeMillis();
   Object obj = null;
   try {
      obj = ctx.proceed();
      return obj;
   }
   finally {
      time = System.currentTimeMillis() - beforeTime;
      // Log time
   }
}

然后放

@Interceptors(PerformanceInterceptor.class) 

在您想要测量的任何方法之前。

无论如何,我尝试了这个,它似乎工作正常。

我还添加了一个

public static long countCalls = 0;

到 PerformanceInterceptor 类和一个

countCalls++; 

到 measureTime() 似乎也可以正常工作

戴上新帽子后,我会问我是否可以使用 countCalls,Glassfish/JEE6 是否可以在用作拦截器的 Java 类中使用静态变量……特别是在线程安全方面。我知道通常你应该在 Java 中同步类变量的设置,但我不知道 JEE6/Glassfish 的情况如何。有什么想法吗 ?

4

1 回答 1

1

在这种情况下,容器没有提供任何额外的线程安全。每个 bean 实例都有自己的拦截器实例。因此,多个线程可以同时访问静态 countCalls。

这就是为什么你必须像往常一样保护它的读取和写入。其他可能性是使用AtomicLong

private static final AtomicLong callCount = new AtomicLong();

private long getCallCount() {
   return callCount.get();
}

private void increaseCountCall() {
   callCount.getAndIncrement();
}

正如预期的那样,这些解决方案只有在所有实例都在同一个 JVM 中时才能工作,因为需要集群共享存储。

于 2012-07-19T08:44:23.707 回答