engine.js 文件路径 》 dwr.jar >org.directwebremoting 包下。
dwr.engine.setActiveReverseAjax(true),当设置了 ture ,就会执行 engine.js 中的 dwr.engine._handlePollRetry 方法,这里会设置 心跳检测
var heartbeatInterval = setInterval(function() {
if (dwr.engine._maxRetries === -1 || dwr.engine._retries < dwr.engine._maxRetries) {
dwr.engine._execute(null, '__System', 'checkHeartbeat', [ function() {
// We found a heartbeat, we are back online!
clearInterval(heartbeatInterval);
dwr.engine._poll();
}]);
dwr.engine._retries++;
dwr.engine._debug("DWR Offline - poll retry - interval: " + retryInterval/1000 + " seconds");
} else {
// maxRetries has been reached, stop the heartbeat check.
clearInterval(heartbeatInterval);
dwr.engine._debug("max retries reached, stop polling for server status.");
dwr.engine._handlePollStatusChange(false, ex, batch);
}
}, retryInterval);
retryInterval :时间间隔。
问题原因:
当系统启动的时候 有许多个__SystemcheckHeartbeat.dwr 请求处于pending中,这样就导致当系统启动成功后, dwr.engine._poll()这个方法会执行多次,该方法会发起ReverseAjax.dwr请求,由于该方法响应时间过长(我的项目中将近一分钟),就导致了其他请求阻塞。
解决方法:
将_handlePollRetry替换掉,就是在执行 dwr.engine.setActiveReverseAjax(true) 之前,加入如下代码(红色字体为在源代码上新加的代码);
dwr.engine._handlePollRetry = function(batch, ex) {
var retryInterval = dwr.engine._getRetryInterval();
// If number of retries is equal to the retryIntervals array length, call the supplied pollStatusHandler and go offline.
if (dwr.engine._retries === dwr.engine._retryIntervals.length - 1) {
dwr.engine._debug("poll retry - going offline: " + retryInterval/1000 + " seconds");
dwr.engine._handlePollStatusChange(false, ex, batch);
// We are offline, continue to check for a heartbeat until _retries is > _maxRetries.
var pollTimes = 0; //poll请求次数
var heartbeatInterval = setInterval(function() {
if (dwr.engine._maxRetries === -1 || dwr.engine._retries < dwr.engine._maxRetries) {
dwr.engine._execute(null, '__System', 'checkHeartbeat', [ function() {
// We found a heartbeat, we are back online!
pollTimes = pollTimes + 1;
clearInterval(heartbeatInterval);
if(pollTimes <= 1){
dwr.engine._poll();
}
}]);
dwr.engine._retries++;
dwr.engine._debug("DWR Offline - poll retry - interval: " + retryInterval/1000 + " seconds");
} else {
// maxRetries has been reached, stop the heartbeat check.
clearInterval(heartbeatInterval);
dwr.engine._debug("max retries reached, stop polling for server status.");
dwr.engine._handlePollStatusChange(false, ex, batch);
}
}, retryInterval);
} else { // We are still online, poll again.
dwr.engine._retries++;
dwr.engine.batch.remove(batch);
dwr.engine._debug("DWR Online - poll retry - interval: " + retryInterval/1000 + " seconds");
setTimeout(dwr.engine._poll, retryInterval);
}
};
sssss