繁体   English   中英

JSF中的并发ajax请求

[英]Concurrent ajax requests in JSF

页面显示后,我想加载几个数字列表。 这些列表位于页面的不同元素。 到目前为止,我选择的方法是为每个必须加载的数字列表创建一个a4j:jsFunction,并在文档准备就绪时使用jQuery触发这些函数。

我正在使用JSF 1.2,Facelets 1.1.14和Richfaces 3.3.3。 代码的相关部分如下。

XHTML:

<c:forEach items="#{testMB.list}" var="item" varStatus="status">
    <a4j:jsFunction name="loadNumbers_#{status.index}" action="#{testMB.loadNumbers}" reRender="numbers_#{status.index}">
        <a4j:actionparam name="index" value="#{status.index}" />
    </a4j:jsFunction>
</c:forEach>

<script type="text/javascript">
    //<![CDATA[
    jQuery(document).ready(function($) {
        for (var i = 0; i < #{jstl:length(testMB.list)}; i++) {
            window['loadNumbers_' + i]();
        }
    });
    //]]>       
</script>

托管Bean:

public void loadNumbers() {
    Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
    int index = Integer.parseInt(params.get("index"));
    MyObject obj = list.get(index);
    obj.setNumbers(testBC.loadNumbers(obj));
}

服务器基本上同时接收所有的ajax请求。 似乎这种并发性已经引起了一些问题。 例如,有时,某些请求未调用托管bean中的action方法。 有时,即使对所有请求都调用了action方法,响应中也会缺少某些列表。

在a4j:jsFunction中使用eventsQueue解决了该问题,因为这会创建一个队列来阻止并发请求。 使动作方法同步似乎也可以解决问题。 但是,对于我一直在测试的场景,前一种和后一种解决方案分别花费大约55和30秒,而第一种方法在正确加载时加载和显示所有数字列表仅花费大约12秒。 由于数字列表的计算可能需要一段时间,因此我想利用并发计算来及时显示它们。

对于如何解决此问题,我将不胜感激。

可以使用a4j:polla4j:push来完成

我的建议是。

使用嵌入此网格的t:datatablet:panelGrida4j:outputPanelt:panelGroup中将名称命名为“ 列表

使用a4j:polla4j:push刷新给rerender ='lists'

希望这可以帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM