Primefaces调用bean时RemoteCommand时滞

时间:2014-11-18 09:48:49

标签: java performance jsf primefaces remotecommand

RemoteCommand caling bean方法时滞存在性能问题。

使用primefaces 4.0,我们的xhtml页面,在运行时加载了大量的 divs into panel

<p:outputPanel id="runtime_panel" autoUpdate="true" />

某些SelectOneRadio控件通过setOnchange()方法拥有侦听器。 他们调用RemoteCommand,它在设计时在xhtml页面中定义:

<p:remoteCommand name="ourRemoteCommand" 
actionListener="#{bean.someMethod}" update="runtime_panel"
/>

bean.someMethod的目的是通过ajax在我们的页面中显示或隐藏某些GUI控件。 Bean是请求作用域。

问题是,从客户端调用 bean.someMethod 时会出现一定的时间延迟。 在我的测试中,javascript响应突然,但是当我通过服务器端的断点捕获 bean.someMethod 时,有相当长的滞后时间 - 约2.5秒。

我还将bean范围更改为会话作用域以消除构造阶段滞后,但这种接缝不是问题 - 它没有解决时间延迟。

如果“ runtime_panel ”中只有少量元素,我没有注意到任何延迟, 和断点在“bean.someMethod”中立即停止。控件数量和响应时间之间存在相关性。

我还创建了另一个测试 - 在页面的开头以自己的形式放置虚拟RemoteCommand。

<form>
<p:remoteCommand name="rcgg" partialSubmit="true" process="@this" update="@none" actionListener="#{bean.testMethod()}" />
<h:outputText id="msgs" value="Ajax Submit" />
<p:commandButton type="button" onclick="console.log('client start');rcgg('ddd');console.log('client end')" value="Ajax1" icon="ui-icon-refresh" />
</form> 

因此,服务器端代码也会立即执行。但是当“outputPanel”具有许多gui元素时,也存在时滞 当服务器端开始执行时,即使与此RemoteCommand“rcgg”没有任何关系。奇怪。

我还测试了几个RemoteCommand到达(

immediate="false" async="true" partialSubmit="true" ignoreAutoUpdate="true" process="@none" global="false"  
 update="@none"

)但也没有成功。

我不知道如何摆脱这种“豆呼叫滞后”。
我真的需要你的帮助。

2 个答案:

答案 0 :(得分:1)

通常您必须在process=@this上使用p:remoteCommand,否则它将提交整个h:form及其组成部分。
因此,最好将p:remoteCommand保持在单独的h:form中。

如果这也不起作用,您可以始终使用ManagedBean上的RequestContext update方法来更新组件。

RequestContext.getCurrentInstance().update("COMPONENT_ID_TO_UPDATE")

答案 1 :(得分:0)

此技巧可使用remoteCommand加快页面的开始加载内容。


Primefaces RemoteCommand示例:

<p:remoteCommand name="load_users"
                 process="@this"
                 update="@form"
                 actionListener="#{myBean.loadUsers}" />

name的{​​{1}}属性是启动整个过程的无主体JavaScript代码。 p:remoteCommand通过调用备用Bean的myBean.loadUsers来加载数据,并以(actionListener)形式或目标组件的属性ID进行部分更新。

下面的JavaScript代码段是许多jQuery代码中的常见现象。它是jQuery ready事件的处理程序。当页面准备好进行更多操作时,它将调用我们的@form JavaScript函数,该函数设置为load_users()的{​​{1}}属性。此时,页面已开始呈现,并且已经对用户可见。您需要将其包括在页面的开始部分。

name

参考: