我的Wicket应用程序偶尔会有一些长时间运行的AJAX请求。发生这种情况时,应用程序很大程度上无法使用,因为后续的AJAX请求排队等待当前请求后的同步处理。我希望请求在一段时间后终止,无论是否已经返回响应(我有一个用户要求,如果发生这种情况,我们应该向用户显示错误消息并继续)。这提出了两个问题:
我查看了wicket-ajax.js文件,但我没有看到任何请求超时的提及。
我甚至尝试在客户端超时后尝试重新加载页面,但不幸的是服务器仍在忙着处理原始的AJAX请求,直到AJAX请求完成处理才返回。
谢谢!
答案 0 :(得分:3)
我认为让客户“取消”请求对您没有帮助。 (但这可行。)
重点是服务器正忙于处理不再需要的请求。如果要超时执行此类操作,则必须在服务器端实现超时。如果操作时间过长,则服务器将中止该操作并返回一些错误值作为Ajax请求的结果。
关于排队问题:尽管有同步请求,您可以考虑使用异步请求。这意味着客户端首先发送启动长时间运行进程的请求。此请求立即返回。然后客户端定期轮询服务器并询问该进程是否已完成。那些轮询请求也会立即返回,说明进程仍在运行或已完成某个结果。
答案 1 :(得分:2)
解决方案失败:在给定的setTimeout之后,我终止了活动传输并重新启动了通道,该通道处理客户端的所有内容。我通过将每个ID绑定到一个ID并根据每次发出请求时以及每次请求完成时递增的全局引用来检查请求冲突。
function longRunningCallCheck(refId) {
// make sure the reference id matches the global id.
// this indicates that we are still processing the
// long running ajax call.
if(refId == id){
// perform client processing here
// kill all active transport layers
var t = Wicket.Ajax.transports;
for (var i = 0; i < t.length; ++i) {
if (t[i].readyState != 0) {
t[i].onreadystatechange = Wicket.emptyFunction;
t[i].abort();
}
}
// process the default channel
Wicket.channelManager.done('0|s');
}
}
不幸的是,这仍然阻止了PageMap被阻止,任何后续调用都等待请求在服务器端完成。
此时我的解决方案是为用户提供使用BookmarkablePageLink(实例化新页面,因此不会在PageMap上发生争用)注销的选项。绝对不是最佳的。
任何更好的解决方案都非常受欢迎,但这是我能想到的最好的解决方案。