Почему JSF 2.2 требует больше времени для частичного рендеринга ajax-запроса в Wildfly

Я работаю над переносом проекта с (JSF 1.2, Richfaces 3.3.4, работающего на JBoss 4.2.3) на (JSF 2.2, Richfaces 4.5, работающего на Wildfly 8.1.0). После частичного переноса некоторых представлений я обнаружил, что производительность приложения, использующего JSF 2, ужасна.

Я заметил эту проблему, когда отправляется запрос ajax, JSF 2 отображает все представление, хотя атрибут рендеринга указывает на один outputText

Пример (можно загрузить с ЗДЕСЬ)

В моем примере я буду использовать один и тот же образец кода для JSF 1.2 и 2.2. После этого я буду нажимать кнопку ajax несколько раз и измерять время ответа на каждый запрос с помощью инструмента проверки Chrome.

Учитывая следующий index1.XHTML с использованием JSF 1.2 и Richfaces 3.3.4

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:a="http://richfaces.org/a4j">
    <head>
    </head>

    <body id="body">
        <!-- Later the outputText elements below will be included here-->
        <h:form>
            <a:commandButton value="TestBtn" reRender="output"/>
        </h:form>
        <h:outputText value="test" id="output"/>
    </body>
</html>

Нажав на «TestBtn» несколько раз, среднее время составляет 15 мс:

введите здесь описание изображения

Учитывая следующий index2.XHTML с использованием JSF 2.2 и Richfaces 4.5.0

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:a="http://richfaces.org/a4j">
    <h:head>
    </h:head>

    <h:body id="body">
        <!-- Later the outputText elements below will be included here-->
        <h:form>
            <a:commandButton value="TestBtn" render="output"/>
        </h:form>
        <h:outputText value="test" id="output"/>
    </h:body>
</html>

При многократном нажатии на «TestBtn» среднее время составляет 18 мс:

введите здесь описание изображения

Ну, пока все хорошо. Теперь проблема с производительностью возникает, когда я добавляю следующие элементы outputText

<h:outputText value="testingElement"/>
<h:outputText value="testingElement"/>
<h:outputText value="testingElement"/>
<h:outputText value="testingElement"/>
<h:outputText value="testingElement"/>
<h:outputText value="testingElement"/>
<h:outputText value="testingElement"/>
<h:outputText value="testingElement"/>
<h:outputText value="testingElement"/>
<h:outputText value="testingElement"/>
 ............. (300 times, of course this is just for testing purposes)

Я добавил эти элементы 300 раз в index1.xhtml и index2.xhtml и повторил те же тесты.

Результаты с использованием index1.xhtml (JSF 1.2), я получил среднее время 19 мс.

введите здесь описание изображения

Результаты с использованием index2.xhtml (JSF 2.2), я получил среднее время 150 мс (!!!!!)

введите здесь описание изображения

Что в 8 раз медленнее, чем JSF 1.2.

Может кто-нибудь объяснить, почему JSF 2 медленнее, чем JSF 1? и как я могу улучшить производительность?

ОБНОВЛЕНИЕ

Тестируя пример JSF 2 с элементами на сервере tomcat, я получил в среднем 20 мс. Я предполагаю, что проблема вызвана со стороны Wildfly.

К сожалению, я не могу менять серверы. Я должен найти решение для JSF 2 для работы на wildfly.

Я попытался перейти на wildfly 8.2.0 --> Все та же проблема с производительностью.

Самая близкая проблема, которую я смог найти после поиска в Google, это POST.

Поэтому я обновил свой JDK до jdk1.7.0_71 -> Все та же проблема с производительностью.

ОБНОВЛЕНИЕ 2

Вот лог ajax-запроса (за один клик), отправленного на сервер Wildfly. (LOG)

Почему JSF строит все представление, хотя я повторно отображаю только определенный идентификатор?

** Примечание. Я не знаю, так ли работает JSF, или я просто неправильно его использую. **

Заранее спасибо, Тефа


person TeFa    schedule 11.12.2014    source источник
comment
Почему голосовать против? Если вы думаете, что я что-то не понял, я был бы признателен, если бы вы могли мне объяснить.   -  person TeFa    schedule 11.12.2014
comment
Я не уверен, почему вы проголосовали против. У вас есть хороший вопрос здесь. Вы пробовали тест без Richfaces?   -  person Ali Cheaito    schedule 11.12.2014
comment
Да, я устал без ричфейсов в JSF 2, та же проблема   -  person TeFa    schedule 11.12.2014


Ответы (3)


Наконец-то я понял, почему ответ ajax с Wildfly медленный только для меня.

Оказывается, эта проблема с производительностью не имеет ничего общего с версией JSF или версией mojarra. На самом деле это связано с конфигурацией Wildfly (точнее, Weld)

«org.jboss.as.weld» был отключен на моем сервере wildfly. По умолчанию, когда вы загружаете wildfly, он включен. Вот почему ни у кого не было проблем с производительностью.

Чтобы включить/отключить сварку в Wildfly, просто добавьте/удалите следующие 2 строки из файла standalone.xml, который находится в «{JBOSS_HOME}/standalone/configuration» (расширение и подсистема):

<extensions>
    ..............
    <extension module="org.jboss.as.weld"/>
    ..............
</extensions>
<profile>
     ..............
    <subsystem xmlns="urn:jboss:domain:weld:2.0"/>
</profile>

Если вы удалите сварку и попробуете пример, который я упомянул в своем вопросе, у вас должна быть задержка ответов ajax.

Я не знаю, почему отключение сварки вызывает эту проблему, но это другой вопрос, не связанный с этим текущим вопросом.

Надеюсь, это может помочь кому-то

person TeFa    schedule 16.12.2014

Я запустил ваш пример без Richfaces, используя h: commandButton и 300 outputText, которые привязаны к свойству компонента, обернутому с помощью panelGroup. Хотя разница была, это не треск земли. Однако может оказаться целесообразным создать задачу JIRA для команды Mojarra, чтобы изучить ее.

Вот мои результаты. Я отбросил первый запрос, чтобы исключить любой эффект инициализации. Возможно, наиболее заметна разница со средним значением для последних 5 запросов, поскольку к этому времени время отклика перестало колебаться (возможно, сработала некоторая оптимизация).

Использование Mojarra 2.2.6:

Sample size: 20
Total time:  2111 ms
Average time: 105.55 ms
STDDEV: 22.01
Last 5 average: 85.40 ms

Использование Mojarra 2.1.28:

Sample size: 20
Total time:  1331 ms
Average time: 66.55 ms
STDDEV: 29.94
Last 5 average: 39.60 ms
person Ali Cheaito    schedule 11.12.2014
comment
Спасибо. Я пробовал Primefaces, и у меня возникла та же проблема. Посмотрев на ваши результаты, я подумал, что проблема может быть в Wildfly. Итак, я попытался запустить пример на сервере tomcat ----› Нет проблем, я получил среднее время ответа 20 мс. - person TeFa; 11.12.2014
comment
Мои результаты взяты из jBoss EAP 6.3 для Mojarra 2.1.28 и сервера Wildfly 8.1.0 для другого. - person Ali Cheaito; 11.12.2014
comment
Несмотря на то, что я обновил Mojarra в wildfly 8.1.0 с 2.2.6 до 2.2.8, у меня все еще есть проблема с производительностью. Я обновил свой вопрос (обновление 2), не могли бы вы его проверить. Спасибо за ваше время. - person TeFa; 12.12.2014

Я протестировал ваш пример, но использовал известные Primefaces вместо Richfaces. Время отклика на каждое нажатие кнопки составило 12 мс. Я сомневаюсь, что может быть что-то не так с кодом javascript командной кнопки Richfaces. Вы можете загрузить Primefaces, выполнив тот же тест, а затем вернуться сюда, чтобы сказать мне, быстрее он или медленнее.

Jsf 2.2 300 outputText с Primefaces

person meteorzero    schedule 11.12.2014
comment
Спасибо. Я пробовал Primefaces, и у меня возникла та же проблема. Посмотрев на ваши результаты, я подумал, что проблема может быть в Wildfly. Итак, я попытался запустить пример на сервере tomcat ----› Никаких проблем, я получил среднее время ответа 20 мс. - person TeFa; 11.12.2014