2014-02-12 3 views
2

Я создал класс, который реализует PhaseListener и печатает сроки для каждой фазы в журнале. Теперь я хотел бы напечатать это на странице JSF, поэтому я могу видеть, сколько времени прошло каждый этап, когда страница была визуализирована.Как представить фазовые тайминги JSF на странице

Я не знаю, возможно ли это; может быть, это проблема с курицей и яйцом?

Код

Как сказал мне LaurentG, это не возможно, чтобы добиться того, что я искал. Если кто-то ищет кода фазам времени, хотя, вот один из способов сделать это:

import javax.faces.event.PhaseEvent; 
import javax.faces.event.PhaseId; 
import javax.faces.event.PhaseListener; 

public class LogPhaseListener implements PhaseListener { 

    private long startTimeP1; 
    private long startTimeP2; 
    private long startTimeP3; 
    private long startTimeP4; 
    private long startTimeP5; 
    private long startTimeP6; 
    private long timeP1; 
    private long timeP2; 
    private long timeP3; 
    private long timeP4; 
    private long timeP5; 
    private long timeP6; 
    private long timeAll; 

    @Override 
    public void afterPhase(PhaseEvent event) { 

     if (event.getPhaseId() == PhaseId.RESTORE_VIEW) { 
      timeP1 = (long) ((System.nanoTime() - startTimeP1) * 0.000001); 
      System.err.println("|  Phase 1 Execution time -- RESTORE_VIEW -- " + timeP1 + "ms"); 
     } 
     if (event.getPhaseId() == PhaseId.APPLY_REQUEST_VALUES) { 
      timeP2 = (long) ((System.nanoTime() - startTimeP2) * 0.000001); 
      System.err.println("|  Phase 2 Execution time -- APPLY_REQUEST_VALUES -- " + timeP2 + "ms"); 
     } 
     if (event.getPhaseId() == PhaseId.PROCESS_VALIDATIONS) { 
      timeP3 = (long) ((System.nanoTime() - startTimeP3) * 0.000001); 
      System.err.println("|  Phase 3 Execution time -- PROCESS_VALIDATIONS -- " + timeP3 + "ms"); 
     } 
     if (event.getPhaseId() == PhaseId.UPDATE_MODEL_VALUES) { 
      timeP4 = (long) ((System.nanoTime() - startTimeP4) * 0.000001); 
      System.err.println("|  Phase 4 Execution time -- UPDATE_MODEL_VALUES -- " + timeP4 + "ms"); 
     } 
     if (event.getPhaseId() == PhaseId.INVOKE_APPLICATION) { 
      timeP5 = (long) ((System.nanoTime() - startTimeP5) * 0.000001); 
      System.err.println("|  Phase 5 Execution time -- INVOKE_APPLICATION -- " + timeP5 + "ms"); 
     } 
     if (event.getPhaseId() == PhaseId.RENDER_RESPONSE) { 
      timeP6 = (long) ((System.nanoTime() - startTimeP6) * 0.000001); 
      timeAll = (long) ((System.nanoTime() - startTimeP1) * 0.000001); 

      System.err.println("|  Phase 6 Execution time -- RENDER_RESPONSE -- " + timeP6 + "ms"); 
      System.err.println("|  Phase X Execution time -- ALL_PHASES -- " + timeAll + "ms"); 
     } 
    } 

    @Override 
    public void beforePhase(PhaseEvent event) { 

     if (event.getPhaseId() == PhaseId.RESTORE_VIEW) { 
      startTimeP1 = System.nanoTime(); 
     } 
     if (event.getPhaseId() == PhaseId.APPLY_REQUEST_VALUES) { 
      startTimeP2 = System.nanoTime(); 
     } 
     if (event.getPhaseId() == PhaseId.PROCESS_VALIDATIONS) { 
      startTimeP3 = System.nanoTime(); 
     } 
     if (event.getPhaseId() == PhaseId.UPDATE_MODEL_VALUES) { 
      startTimeP4 = System.nanoTime(); 
     } 
     if (event.getPhaseId() == PhaseId.INVOKE_APPLICATION) { 
      startTimeP5 = System.nanoTime(); 
     } 
     if (event.getPhaseId() == PhaseId.RENDER_RESPONSE) { 
      startTimeP6 = System.nanoTime(); 
     } 
    } 

    @Override 
    public PhaseId getPhaseId() { 
     return PhaseId.ANY_PHASE; 
    } 

} 

И добавить следующее faces-config.xml

<lifecycle> 
    <phase-listener>package.name.LogPhaseListener</phase-listener> 
</lifecycle> 

Оригинальный код найти на сайте Энди Gibsons: http://www.andygibson.net/blog/tutorial/timing-jsf-requests-using-a-phase-listener/

+0

Быстрый и грязный: предоставить журнал через веб-сервис, который вы можете опросить с помощью javascript на стороне клиента. – mabi

ответ

0

Очевидно, что вы не можете распечатать время фазы RENDER_RESPONSE на странице, на которой вы хотите получить время рендеринга. Но вы можете сохранить время в представлении или области видимости [1] bean и вызвать его позже (например, используя Ajax) на своей странице.

Альтернатива: хранит время процесса в компоненте и использует его для визуализации специальной страницы отладки, где вы можете контролировать все тайминги всей отображаемой страницы. Таким образом, вы также не смешиваете информацию об отладке на продуктивной странице.

Кстати, я нахожу вашу идею довольно странной. Обычно я просто просматриваю журналы журналов сервера. Я также всегда настраиваю пользовательский PhaseListener, который регистрирует время обработки для каждой фазы и настраивает его на время регистрации в специальном журнале (например, perf.log).

Ссылки:

+0

Правда, я не мог понять, как это может логически работать, хотя часто бывают вещи, о которых я не думаю, что другие, более знающие люди делают, следовательно, мой вопрос. Цель для меня заключалась в том, чтобы автоматически получать эту информацию на странице при разработке; это не важно, но я подумал, есть ли способ достичь этого. Спасибо, что нашли время, отвечая на мой вопрос. – nivis

2

Вы можете использовать JSFInspector визуализировать продолжительность каждой фазы жизненного цикла на странице.