【问题标题】:Primefaces RemoteCommand time lag when calling beanPrimefaces RemoteCommand调用bean时的时间滞后
【发布时间】:2015-01-15 10:56:05
【问题描述】:

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

使用我们的 xhtml 页面 primefaces 4.0 在运行时加载大量 div进入面板

<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 arributes (

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

) 但也没有成功。

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

【问题讨论】:

    标签: java performance jsf primefaces remotecommand


    【解决方案1】:

    通常您必须在p:remoteCommand 上使用process=@this,否则它将提交整个h:form 及其组件。
    所以最好将p:remoteCommand 放在单独的h:form 中。

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

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

    【讨论】:

      【解决方案2】:

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


      Primefaces RemoteCommand 示例:

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

      p:remoteCommandname 属性是启动整个过程的无主体 JavaScript 代码。 actionListener 通过调用支持 bean 的 myBean.loadUsers,加载数据并导致表单 (@form) 或目标组件的属性 ID 的部分更新。

      下面的 JavaScript sn-p 在许多 jQuery 代码中很常见。它是 jQuery 就绪事件的处理程序。当页面准备好进行更多操作时,它会调用我们的load_users() JavaScript 函数,设置为remoteCommandname 属性。此时页面已经开始渲染并且已经对用户可见。您需要将其包含在页面的开头部分。

      <script type="text/javascript">
          $(document).ready(function() {
              load_users(); 
          });            
      </script>
      

      参考:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-06
        • 1970-01-01
        • 2013-04-16
        • 2013-07-13
        • 2012-10-06
        • 1970-01-01
        相关资源
        最近更新 更多