Как измерить время выполнения действия в JSF? - PullRequest
1 голос
/ 02 марта 2012

Я ищу способ измерения времени выполнения всех моих действий в моем приложении JSF.

Хакерское решение, которое я нашел до сих пор, заключается в расширении com.sun.faces.application.ActionListenerImpl , перезаписи processAction и вызове super.processAction в моей реализации:

public class MyActionListener extends ActionListenerImpl {

            public void processAction(ActionEvent event) throws FacesException {
                   watch.start();
                    super.processAction(event);
                   watch.stop();
            }
}

Затем я добавляю свою собственную реализацию ActionListener к конфигурации лиц:

<application>
        <action-listener>MyActionListener</action-listener>
</application

Но это добавляет зависимость от jsf-impl и является хакерским.Есть ли лучшее решение?

Ответы [ 2 ]

2 голосов
/ 02 марта 2012

Вы можете использовать вместо PhaseListener и подключить PhaseId.INVOKE_APPLICATION.

public class MyPhaseListener implements PhaseListener {

    public PhaseId getPhaseId() {
        return PhaseId.INVOKE_APPLICATION;
    }

    public void beforePhase(PhaseEvent event) {
        watch.start();
    }

    public void afterPhase(PhaseEvent event) {
        watch.stop();
    }

}

Зарегистрируйте его как <phase-listener>.

Обратите внимание, я понимаю, что ваш код псевдо, но для полноты картины я хотел бы предупредить вас, что вам нужно понять, что один и тот же экземпляр слушателя является общим для всех потоков / запросов. Вы бы предпочли сохранить watch в карте запросов и определенно не в качестве переменной экземпляра.

0 голосов
/ 12 марта 2012

Лучшим решением было реализовать ServletContextListener, реализовать contextInitialized, создать прокси отражения для текущего прослушивателя действий по умолчанию и измерить время в обработчике вызова прокси.

@Override
    public void contextInitialized(ServletContextEvent sce) {
        // get JSF application factory
        ApplicationFactory applicationFactory = (ApplicationFactory) FactoryFinder.getFactory(FactoryFinder.APPLICATION_FACTORY);
        Application application = applicationFactory.getApplication();
        ActionListener defaultActionListener = application.getActionListener();

        // create proxy for the default actionlistener
        ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
        ActionListenerInvocationHandler actionListenerInvocationHandler = new ActionListenerInvocationHandler(defaultActionListener);
        @SuppressWarnings("rawtypes")
        Class[] interfaces = new Class[] { ActionListener.class };
        ActionListener actionListenerProxy = (ActionListener) Proxy.newProxyInstance(contextClassLoader, interfaces, actionListenerInvocationHandler);

        // set proxied actionListener as new default actionlistener
        application.setActionListener(actionListenerProxy);

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...