我需要在服务器中保持我的请求,直到新数据出现。我正在使用 Tomcat 6 作为我的网络服务器。所以这是我的 JQuery 代码,
function sendMessage() {
var message = $("#message").val();
$.ajax({
type: "POST",
cache: false,
url: "sendMessage.html",
data: "message=" + message,
dataType: "html",
success: function(response) {
},
error: function(e) {
//alert('Error: ' + e);
},
});
}
function startLongPolling(){
$.ajax({
type: "POST",
cache: false,
url: "LongPoll.html",
dataType: "html",
success: function(response) {
if(response != null && response !="" && response !="null")
$("#sucess").html(response);
},
error: function(e) {
//alert('Error: ' + e);
},
complete: function(e) {
startLongPolling();
},
});
}
我的 java 代码将是,
@RequestMapping(value = "LongPoll.html", method=RequestMethod.POST )
public @ResponseBody String longLongPolling(HttpSession session) {
String sessionId = session.getId().toString();
AgentState agentState = ApplicaionManager.agentDetail.get(sessionId);
String message = null;
if(ApplicaionManager.agentDetail.containsKey(sessionId)){
while(true){
if(agentState.isStateChange() == true){
message = agentState.getMessage();
if(message != null)
agentState.setStateChange(false);
System.out.println("Break for session "+sessionId+" due to Agent State changed");
break;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
System.out.println("While exited for session"+sessionId);
return message;
}
但每 11秒有一个continous request sent to server
。我不知道怎么可能。我已使用 Chrome开发人员工具检查了这一点。
希望我们的堆栈用户能帮助我。
答案 0 :(得分:2)
这是正常/预期的。根据您的浏览器和(特别是)前端服务器(Apache / NGINX)和Web服务器(Tomcat?)配置,您将拥有:
这些设置基本上可以防止服务器因永远不会完成和耗尽线程池中的线程的请求而被垃圾邮件发送。
您可以增加这些值,但是您应该始终在设置代码时考虑到超时。基本上你想在客户端做:
请注意,此解决方案不可扩展:通常您将(例如)200个线程处理传入请求。他们的想法是他们快速完成。如果线程池耗尽,则用户必须等待新连接。但是使用200个线程,您可以为超过2.000个用户提供服务。但是,如果由于长池而阻塞了线程,那就不行了。
如果可能的话,你应该真正研究WebSockets,它现在可用于新版本的Java。
编辑 正如Konrad在下面建议的那样,您可以使用类似socket.io的内容,它会自动回退到其他机制。对于服务器端可用调用Atmosphere,有一个基于Java的实现,但我没有尝试过。