我有一个奇怪的问题,我无法仅通过谷歌搜索找到解决方案。据我了解,由于我的服务器使用keep-alive标头,因此我对它的所有XHR请求最终都耗尽了thios机器的所有可用TCP连接,并导致服务器完全挂起。同时,我能够POST,问题仅在GET请求中仍然存在。
我们正在使用一个相当大的基于Java的HelpDesk系统作为后端,并且由于公司的要求,需要保持这种方式。后端是Linux服务器,运行带有Apache Tomcat 7.0和Jetty的Red Hat Enterprise Linux Server 6.4版。
我有一个带有一些javascript的简单网页,可以根据用户的输入调用后端。当用户从条目列表中选择一个条目时,就会调用我们后端的REST API。然后,它返回一个响应,该响应将被解析并呈现给用户。
问题是:用户每次单击按钮都会进行呼叫。大约20次单击后,服务器突然停止响应并通常挂起。正如我希望的那样,这是跨浏览器的事情,而不仅仅是Chrome。
我也尝试在服务器端进行故障排除,但是没有运气。我无法从服务器端日志记录或后端日志记录中获取任何有意义的信息。这样便有更多的RAM,没有资源使用高峰。好像请求突然完全停止到达服务器一样。
我尝试添加request.abort();到最后,但我想它也不做任何事情。
我们不是唯一使用此服务器的人,因此无法摆脱“保持活动”设置。
对于代码,这是一个简单的XHR请求。
function getInfo(authToken, CurrEntryID) {
var data = "undefined=";
var request = new XMLHttpRequest();
request.withCredentials = true;
request.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
TableObj = JSON.parse(request.response);
tableObjArr.push(TableObj);
request.abort();
}
};
request.open("GET", "http://XXXX:8080/j2ep/rest/api/XXXX/v1/entry/XXXX/" + CurrEntryID + "/XXXXXXXXXXXXXX", true);
request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
request.setRequestHeader("username", "XXXXXXX");
request.setRequestHeader("Authorization", authToken);
request.setRequestHeader("Cache-Control", "max-age=0");
request.send(data);
}
是否可以只打开一次与特定资源的连接以从“另一端”获取数据并保持打开状态直到用户离开页面?我该怎么做?
谢谢!