Я однажды сделал нечто подобное. Если я хорошо помню, у меня было что-то вроде
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, вы должны писать такой инфраструктурный код, только если не можете решить свою проблему с помощью существующего решения. В моем случае я также сравнивал внутреннее время моего кода, а не только полное время обработки запроса .