【发布时间】: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