[英]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:poll或a4j:push来完成
我的建议是。
使用嵌入此网格的t:datatable或t:panelGrid在a4j:outputPanel或t:panelGroup中将名称命名为“ 列表 ”
使用a4j:poll或a4j:push刷新给rerender ='lists'
希望这可以帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.