长时间轮询会冻结浏览器并阻止其他ajax请求
我正在尝试在Spring-MVC Web
App中实施长时间轮询,但是在4-5个AJAX请求继续执行后,它冻结了我的浏览器和其他请求。我不知道这是我的相关代码。
@Asynchronous @RequestMapping("/notify")
public @ResponseBody
Events notifyEvent(HttpServletRequest request) {
Events events = null;
try {
events = (Events) request.getSession(false).getServletContext().getAttribute("events");
System.out.println("Request Came from" + ((com.hcdc.coedp.safe.domain.User) request.getSession(false).getAttribute(Constants.KEY_LOGGED_IN_USER)).getLoginId());
if (!events.getTypeOfEvents().isEmpty()) {
System.out.println("Removing older entries");
events.getTypeOfEvents().clear();
}
while (!events.isHappend()) {
//Waiting for event to happen.
}
events = Events.getInstance();
events.setHappend(false);
request.getSession(false).getServletContext().setAttribute("events", events);
}catch (Exception e) {
e.printStackTrace();
}
return events;
}
$(document).ready(function() { $.ajaxSetup({
async:true//set a global ajax requests as asynchronus
});
alert('Handler for .onload() called.');
waitForMsg();
});
function waitForMsg(){
xhr= $.ajax({
type: "POST",
url: '<%=request.getContextPath()%>/notification/notify',
async: true, /* If set to non-async, browser shows page as "Loading.."*/
cache: false,
timeout:50000, /* Timeout in ms */
global:false,
success: function(data){ /* called when request to notifier completes */
/* Doing smthing with response **/
setTimeout(
waitForMsg, /* Request next message */
1000 /* ..after 1 seconds */
);
},
error: function(XMLHttpRequest, textStatus, errorThrown){
addmsg("error", textStatus + " (" + errorThrown + ")");
setTimeout(
waitForMsg, /* Try again after.. */
15000); /* milliseconds (15seconds) */
}
});
};
function updateFeed(event, data) { var f=eval(data);
alert(f.typeOfEvents.length);
}
function catchAll(event, data, type) {
console.log(data);
alert("error");
console.log(type);
}
$.comet.connect('<%=request.getContextPath()%>/notification/notify');
$(document).bind('feed.comet', updateFeed);
$(document).bind('.comet', catchAll);
都没有弹出警告框.. :(
回答:
看来您的浏览器代码中有一个空的while循环。.这是等待事件的CPU密集型方法。
如果没有事件发生,则客户端将在您希望的50秒超时后终止该请求。但是我不确定服务器线程是否也被杀死,或者它是否“永远”处于永久状态(除非有事件发生)。下一个请求也将启动另一个服务器线程,该线程也会挂在while循环中。也许空的while循环数量对于服务器来说是一个过大的杀伤力,因此它停止接受更多的请求。因此,在某些请求(每个都触发了一个无限的服务器线程)之后,客户端将永远等待新的请求..因为服务器无法处理该请求。
ps:成功后,您评论等待1秒,但将超时设置为10000(10秒)
以上是 长时间轮询会冻结浏览器并阻止其他ajax请求 的全部内容, 来源链接: utcz.com/qa/418475.html