Glassfish - JEE6 - 使用拦截器测量性能

时间:2012-07-18 15:28:47

标签: glassfish java-ee-6 introspection performancecounter

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

的建议
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(),它似乎也起作用o.k。

戴上我的帽子后,我会问我对countCalls的使用是否为o.k.即 Glassfish / JEE6是o.k.和我一起在Java类中使用静态变量 用作拦截器....特别是在螺纹安全方面。我知道 通常你应该在Java中同步类变量的设置,但我 不知道JEE6 / Glassfish的情况如何。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

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

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

private static final AtomicLong callCount = new AtomicLong();

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

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

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