JSF中的并发ajax请求

时间:2014-07-16 20:58:34

标签: ajax jsf concurrency

我想在页面显示后加载几个数字列表。这些列表放在页面的不同元素上。到目前为止我选择的方法是为每个必须加载的数字列表创建一个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>

Managed 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方法,响应中也会丢失一些列表。

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

我很感激有关如何解决此问题的任何意见/建议。

1 个答案:

答案 0 :(得分:0)

可以使用 a4j:民意调查 a4j:推送

来完成

我的建议是。

使用 a4j:outputPanel t:panelGroup 将名称命名为“列表

使用 a4j:民意调查 a4j:推送刷新 rerender ='lists'

希望这有帮助