Как мне сделать «простой» пропускной сервлет-фильтр? - PullRequest
0 голосов
/ 26 мая 2010

Я ищу создать фильтр, который может дать мне две вещи: количество запросов в минуту и ​​среднее время ответа в минуту. Я уже получил отдельные показания, я просто не уверен, как их сложить.

Мой фильтр фиксирует каждый запрос и записывает время, которое занимает каждый запрос:

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 Ответ

1 голос
/ 26 мая 2010

Я однажды сделал нечто подобное. Если я хорошо помню, у меня было что-то вроде

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, также хорошо пометить нить как нить демона .

Я также использовал Google Chart, и на самом деле у меня был еще один ShowStatisticsServlet, который передавал бы XML-файл и превращал данные в хорошую диаграмму. Сервлет будет зависеть не от фильтра, а только от XML-файла, поэтому оба они фактически были отделены. XML-файл может быть создан как временный файл с File.createTempFile. (Другой вариант, конечно, состоял бы в том, чтобы хранить все данные в памяти, но хранение данных было удобно для нас, чтобы сделать резервную копию результатов перф. Тестов и проанализировать их позже)

Некоторые коллеги утверждали, что синхронизация в объекте Statistics "убила бы" производительность приложения, но на практике это было действительно незначительным. Служебные данные для выгрузки файла также, учитывая, что это было сделано каждые 10 секунд или около того.

Надеюсь, что это поможет, или дать вам несколько идей.

PS: И, как прокомментировал @William Louth, вы должны писать такой инфраструктурный код, только если не можете решить свою проблему с помощью существующего решения. В моем случае я также сравнивал внутреннее время моего кода, а не только полное время обработки запроса .

...