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

2019-09-19 17:10发布

用于测量方法的执行时间,我见过的建议使用

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的是okie是Glassfish的/ JEE6在用作拦截....特别是关于线程安全的Java类使用静态变量是确定和我在一起。 我知道,通常你应该在Java类变量的设置同步,但我不知道的情况是JEE6 / Glassfish的东西。 有什么想法吗 ?

Answer 1:

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

这就是为什么你守护读取和写入到它像往常一样。 另一种可能是使用的AtomicLong :

private static final AtomicLong callCount = new AtomicLong();

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

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

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



文章来源: Glassfish - JEE6 - Use of Interceptor to measure performance