如何制作“简单”吞吐量servlet-filter?

时间:2010-05-25 22:59:53

标签: java performance java-ee servlet-filters

我正在寻找创建一个可以给我两件事的过滤器:请求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);
}

此信息将用于创建一些漂亮的Google Chart图表。我不想将数据存储在任何数据库中。只是一种在请求时获取当前数字的方法

因为这是一个大批量的应用程序;低开销是必不可少的。

我假设我的应用程序服务器不提供此信息。

1 个答案:

答案 0 :(得分:1)

我曾做过类似的事情。如果我记得很清楚,我有类似

的东西
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();
    }
}

(那只是一幅草图)

确保Statistics对象正确同步,因为它将同时访问。

我有一个后台DumpStatistics线程,它定期将统计信息转储到XML文件中,以便稍后处理。为了更好的封装,我将线程作为内部类。您当然也可以使用Runnable。正如@Trevor Tippins指出的那样,将线程标记为daemon thread也是一件好事。

我还使用了谷歌图表,实际上还有另一个ShowStatisticsServlet,可以传播XML文件并将数据转换为漂亮的图表。 servlet不依赖于过滤器,而只依赖于XML文件,因此两者实际上都是分离的。可以使用File.createTempFile将XML文件创建为temporary file。 (另一种变体当然是将所有数据保存在内存中,但存储数据对于我们备份性能测试结果并稍后进行分析非常方便)

一位同事声称Statistics对象中的同步会“杀死”应用程序性能,但实际上它实在是可以忽略不计。转储文件的开销也是如此,因为它每10秒左右完成一次。

希望它有所帮助,或者给你一些想法。

PS:正如@William Louth评论的那样,只有在无法解决现有解决方案的问题时,才应编写此类基础架构代码。就我而言,我还在对代码的内部时间进行基准测试,而不仅仅是完整的请求处理时间