2012-07-18 2 views
2

방법의 실행 시간을 측정을 측정하기 위해, 내가 본 제안 글래스 피시 - JEE6 - 인터셉터의 사용은 성능

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) 

를 넣어 사용합니다.

어쨌든 나는 이것을 시도하고 잘 작동하는 것 같습니다.

나는 또한 PerformanceInterceptor 클래스에

public static long countCalls = 0; 

도 오케이 일 것 같습니다 measureTime()에

countCalls++; 

추가

내 newby 모자를 쓰고, countCalls의 사용이 o.k인지 묻습니다. Glassfish/JEE6이 o.k 인 입니다. 저와 함께 Java 클래스의 정적 변수 인 이 인터셉터로 사용되었습니다. 특히 스레드 안전과 관련하여. 나는 보통 Java에서 클래스 변수의 설정을 동기화한다고 가정하고 있지만, JEE6/Glassfish와 어떤 관련이 있는지 알지 못합니다. 이견있는 사람 ?

답변

1

이 경우 컨테이너에서 제공하는 추가적인 스레드 안전성은 없습니다. 각 bean 인스턴스는 인터셉터의 인스턴스를 가지고 있습니다. 결과적으로 다중 스레드는 정적 countCalls에 동시에 액세스 할 수 있습니다.

그런 이유로 평소와 같이 읽고 쓰는 것을 모두 지켜야합니다. 다른 가능성은 AtomicLong를 사용하는 것입니다 : 클러스터 공유 스토리지가 필요합니다 예상대로

private static final AtomicLong callCount = new AtomicLong(); 

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

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

,이 솔루션은 동일한 JVM 만 한 모든 인스턴스가 같이 작동합니다.

+0

감사! 매우 명확한 대답 – user1501183