Как представить время фазы JSF на странице

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

Исходный код найден на сайте Энди Гибсона: http://www.andygibson.net/blog/tutorial/timing-jsf-requests-using-a-phase-listener/


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


Ответы (2)


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

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

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

Ссылки:

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

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

person tasel    schedule 13.02.2014