2010-05-25 4 views
0

요청 pr 분 수와 평균 응답 시간 pr 분의 두 가지를 제공 할 수있는 필터를 만들려고합니다. 나는 이미 개별 독서를 가지고 있는데, 나는 그들을 추가하는 방법을 모르겠다."간단한"처리량 서블릿 필터는 어떻게 만듭니 까?

내 필터는 모든 요청을 캡처하고, 각 요청에 걸리는 시간을 기록 :이 정보는 꽤 구글 차트 차트를 만드는 데 사용됩니다

public void doFilter(ServletRequest request, ...() 
{  
    long start = System.currentTimeMillis(); 
    chain.doFilter(request, response); 
    long stop = System.currentTimeMillis(); 

    String time = Util.getTimeDifferenceInSec(start, stop); 
} 

. 데이터베이스에 데이터를 저장하고 싶지 않습니다. 요청시 현재 숫자를 가져 오는 방법.

대용량 응용 프로그램이므로; 낮은 오버 헤드가 필수적입니다.

내 응용 프로그램 서버가이 정보를 제공하지 않는다고 가정합니다.

+0

더 자세히 설명해 주실 수 있습니까? 대답 '정적 변수'는 아마도 당신이 필요로하는 것을 오해 한 결과 일뿐입니다. –

+0

"대용량 응용 프로그램이므로 낮은 오버 헤드가 필수적입니다." 그런 다음 적절한 툴링, 데이터 관리 및 시각화가있는 환경에서 테스트 한 툴이 시장에있을 때 직접 코딩하십시오. 누군가 X, Y 및 Z를 묻는다면 어떻게됩니까? 응용 프로그램 개발에 중점을두고 성능 전문가가 만든 도구를 사용하여 초기 작업과 향후 유지 관리를 쉽게 수행 할 수 있습니다. 일부 도구는 Open API가 포함 된 헤드리스 (UI가있는) 런타임을 제공하므로 사용자 자신의 관리 대시 보드에 통합 할 수 있습니다. 체크 아웃 http://opencore.jinspired.com –

+0

@William Louth 귀하의 의견은 가치가 있습니다. 당신은 대답으로 그것을 쓸 수 있다고 생각합니다. – ewernli

답변

1

나는 비슷한 것을 한 번했습니다. 내가 잘 기억한다면, 나는 그것이 동시에 액세스 될 것이다

Statistics 개체가 올바르게 동기화되어 있는지 확인합니다 (즉, 단지 스케치의)

public class StatisticsFilter implements ... 
{ 
    public static Statistics stats; 

    public class PeriodicDumpStat extends Thread 
    { 
     ... 
    } 

    public void doFilter(ServletRequest request, ...() 
    {  
     long start = System.currentTimeMillis(); 
     chain.doFilter(request, response); 
     long stop = System.currentTimeMillis(); 
     stats.add(stop - start); 
    } 

    public void init() 
    { 
     Thread t = new PeriodicDumpStat(); 
     t.setDaemon(true); 
     t.start(); 
    } 
} 

같은 것을했다.

나중에 처리 할 XML 파일에 통계를 주기적으로 덤프하는 백그라운드 스레드 DumpStatistics이 있습니다. 더 나은 캡슐화를 위해서, 나는 내부 클래스로서 스레드를 가졌다. 물론 Runnable을 사용할 수도 있습니다. @Trevor Tippins이 지적했듯이 스레드를 daemon thread으로 표시하는 것이 좋습니다.

나는 또한 Google 차트를 사용했으며 XML 파일을 복사하고 데이터를 멋진 차트로 바꾸는 또 다른 ShowStatisticsServlet을 실제로 가지고있었습니다. 서블릿은 필터에 의존하지 않고 XML 파일에만 의존하므로 실제로 두 서블릿이 분리되었습니다. XML 파일은 temporary fileFile.createTempFile으로 만들 수 있습니다. (또 다른 변형은 물론 모든 데이터를 메모리에 유지하지만 데이터를 저장하는 것은 성능 테스트 결과를 백업하고 나중에 분석하는 데 편리했습니다.)

동료 중 일부는 Statistics 개체의 동기화가 앱 성능을 "중지"하지만 실제로는 실제로는 무시할 만했습니다. 파일을 덤프하는 데 소요되는 오버 헤드. 매 10 초마다 완료되었습니다.

희망이 있으면 도움이 될 것입니다.

추신 : @William Louth가 언급 한 바와 같이 기존 솔루션으로 문제를 해결할 수없는 경우에만 인프라 코드를 작성해야합니다. 내 경우에는 전체 요청 처리 시간이 일뿐만 아니라 내 코드의 내부 시간도 벤치마킹했습니다.

+1

덤프 스레드를 데몬으로 설정하여 컨테이너가 완전히 종료되지 않도록 할 수 있습니다. –

+0

@ Trevor Tippins 좋은 지적. 추가됨. – ewernli

+0

재미있는 비트는 PeriodicDumpStat의 내부 일 것입니다. 하지만 웹 응용 프로그램의 스레드 팬이 아닙니다. – Tommy

관련 문제