为什么JSF 2.2需要更多时间在Wildfly上部分呈现ajax请求

时间:2014-12-11 12:31:42

标签: jsf jsf-2 wildfly wildfly-8

我正在努力将项目从(JSF 1.2,Richfaces 3.3.4在JBoss 4.2.3上运行)迁移到(JSF 2.2,Richfaces 4.5在Wildfly 8.1.0上运行)。在部分迁移一些视图后,我发现使用JSF 2的应用程序的性能非常糟糕。

我在发送ajax请求时发现了这个问题,尽管render属性指向一个outputText

,但JSF 2正在渲染整个视图

示例(可以从HERE下载)

在我的示例中,我将对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>

点击&#34; TestBtn&#34;多次,平均时间是15ms:

enter image description here

鉴于以下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>

点击&#34; TestBtn&#34;多次,平均时间是18ms:

enter image description here

好吧,到目前为止一切顺利。现在,当我添加以下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)

我在index1.xhtml和index2.xhtml中添加了300次这些元素并重复了相同的测试

结果使用index1.xhtml(JSF 1.2),平均时间为19ms

enter image description here

结果使用index2.xhtml(JSF 2.2),平均时间为150ms(!!!!!)

enter image description here

这比JSF 1.2慢8倍

有人可以解释为什么JSF 2比JSF 1慢?以及如何改善表现?

更新

使用tomcat服务器上的元素测试JSF 2示例,我平均20ms。我猜这个问题是由Wildfly方引起的。

不幸的是,我无法改变服务器。我应该找到一个JSF 2的解决方案来处理wildfly。

我尝试升级到wildfly 8.2.0 - &gt;性能问题仍然相同。

我在谷歌搜索后找到的最接近的问题是POST

所以我将JDK升级到jdk1.7.0_71 - &gt;性能问题仍然相同。

更新2

这是发送到Wildfly服务器的ajax请求(一次点击)的日志。 (LOG)

为什么JSF构建整个视图,虽然我只是重新呈现特定的ID?

**注意:我不知道这是JSF假设的工作方式,或者我只是在滥用它。 **

先谢谢, 特发

3 个答案:

答案 0 :(得分:4)

我终于找到了为什么ajax对Wildfly的反应对我来说很慢。

事实证明,此性能问题与JSF版本或mojarra版本无关。它实际上与Wildfly配置有关(Weld是具体的)

&#34; org.jboss.as.weld&#34;在我的wildfly服务器中被禁用。默认情况下,当您下载wildfly时,它会启用。这就是为什么没有人遇到任何性能问题。

要在Wildfly中启用/禁用焊接,只需在&#34; {JBOSS_HOME} / standalone / configuration&#34;中找到的standalone.xml中添加/删除以下两行。 (扩展和子系统):

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

如果您删除焊接并尝试我在问题中提到的示例,您应该延迟ajax响应

我不知道为什么禁用焊接会导致此问题,但这是与当前问题无关的不同问题。

希望这可以帮助某人

答案 1 :(得分:0)

我测试了你的例子,但使用着名的Primefaces而不是Richfaces。它为每个按钮点击响应时间提供了12毫秒。我怀疑Richfaces命令按钮javascript代码可能有问题。您可以下载Primefaces,进行相同的测试,然后回到这里告诉我它是快还是慢。

Jsf 2.2 300 outputText with Primefaces

答案 2 :(得分:0)

我在没有Richfaces的情况下运行你的例子,使用h:commandButton和300个outputTexts绑定到bean属性,用panelGroup包装。虽然存在差异,但不是地球喋喋不休。但是,为Mojarra团队创建一个JIRA问题可能值得研究。

以下是我的结果。我抛弃了第一个请求以排除任何初始化效果。最明显的区别可能是最后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