【问题标题】:Concurrent ajax requests in JSFJSF 中的并发 ajax 请求
【发布时间】:2014-07-16 20:58:34
【问题描述】:

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

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

如果有任何关于如何解决此问题的 cmets/建议,我将不胜感激。

【问题讨论】:

    标签: ajax jsf concurrency


    【解决方案1】:

    这可以使用 a4j:polla4j:push

    来完成

    我的建议是。

    a4j:outputPanelt:panelGroup 中使用嵌入此网格的 t:datatablet:panelGrid > 命名为 'lists'

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

    希望对你有帮助

    【讨论】:

    • Srikanth B,列表不会定期更改。我只需要加载一次。所以 a4j:poll 和 a4j:push 在这里并不合适。此外,我无法更改页面的当前布局,因此无法将列表放置在单个网格中。话虽如此,我还是会考虑如何重构代码以使用 a4j:pool 或 a4j:push 来查看并发问题是否仍然存在。
    • Srikanth B,感谢您的建议。我能够重构页面并使用 a4j:push 来满足我的目的。当第一次调用托管 bean 加载页面的数据时,会为每个需要计算的列表创建一个线程。这些线程被放置在一个线程池中。为此,我正在使用 Executors API。随着计算的完成,aj4:push 得到通知并且列表的区域被重新渲染。该解决方案不仅解决了同步问题,而且比以前的解决方案更快。在我的测试中计算和显示所有列表只需要 7 秒。
    猜你喜欢
    • 2011-02-27
    • 2019-07-27
    • 2011-09-05
    • 1970-01-01
    • 2015-12-19
    • 2014-07-25
    • 2011-12-09
    • 2021-08-31
    相关资源
    最近更新 更多