以下的问题,久久不能忘怀。
已经思考几天了。
我来描述一下问题:
我的项目是采用
Language:Java
Server:Tomcat 6
这是一个关于 客户端请求服务器 的问题
描述:由于后台查询数据较慢,查询时间大概在 60s 之内。客户端访问 Jsp 页面,然后 服务器 在数据库 进行查询,查询之后,返回一个 Json 字符串。
我做了一个模拟测试,在测试中,暂停该访问线程,我暂停 30s(内)
requestInterface2.jsp 代码:
Thread.sleep(29000); String result = "{\"status\":\"0\",\"msg\":\" 查询成功!\",\"cname\":\"张三\"}"; out.print(result);
返回:
org.apache.catalina.connector.RequestFacade@9bc36d
[INFO] [2012-05-29 20:42:36] [org.apache.jsp.interface_.requestInterface2_jsp] # 获得客户端请求的URI:/jiaofei/interface/requestInterface2.jsp
[INFO] [2012-05-29 20:42:36] [org.apache.jsp.interface_.requestInterface2_jsp] # 获得客户端请求的服务器的IP地址:192.168.1.192
[INFO] [2012-05-29 20:42:36] [org.apache.jsp.interface_.requestInterface2_jsp] # 获得客户端的IP地址:192.168.1.101
[INFO] [2012-05-29 20:42:36] [org.apache.jsp.interface_.requestInterface2_jsp] # {"status":"0","msg":" 查询成功!","cname":"张三"}
暂停该访问线程,我暂停 30s(之后)
Thread.sleep(31000); String result = "{\"status\":\"0\",\"msg\":\" 查询成功!\",\"cname\":\"张三\"}"; out.print(result);
org.apache.catalina.connector.RequestFacade@15c4ee6
org.apache.catalina.connector.RequestFacade@612ef6
[INFO] [2012-05-29 20:40:21] [org.apache.jsp.interface_.requestInterface2_jsp] # 获得客户端请求的URI:/jiaofei/interface/requestInterface2.jsp
[INFO] [2012-05-29 20:40:21] [org.apache.jsp.interface_.requestInterface2_jsp] # 获得客户端请求的服务器的IP地址:192.168.1.192
[INFO] [2012-05-29 20:40:21] [org.apache.jsp.interface_.requestInterface2_jsp] # 获得客户端的IP地址:192.168.1.101
[INFO] [2012-05-29 20:40:21] [org.apache.jsp.interface_.requestInterface2_jsp] # {"status":"0","msg":"查询成功!","cname":"张三"}
[INFO] [2012-05-29 20:40:51] [org.apache.jsp.interface_.requestInterface2_jsp] # 获得客户端请求的URI:/jiaofei/interface/requestInterface2.jsp
[INFO] [2012-05-29 20:40:51] [org.apache.jsp.interface_.requestInterface2_jsp] # 获得客户端请求的服务器的IP地址:192.168.1.192
[INFO] [2012-05-29 20:40:51] [org.apache.jsp.interface_.requestInterface2_jsp] # 获得客户端的IP地址:192.168.1.101
[INFO] [2012-05-29 20:40:51] [org.apache.jsp.interface_.requestInterface2_jsp] # {"status":"0","msg":"查询成功!","cname":"张三"}
亮点来了,注意,输出了两次 reqeust 内存地址,表示请求了两次 request,输出了两次请求的结果.
我碰到的问题:
1.为什么会客户端会发起 两次请求?
|-- 客户端采用 jqeury ajax 请求
此方法只调用了1次,没有调用第二次。
function loadJson(){
var varRequestURL = "interface/requestInterface2.jsp";
$.post(varRequestURL,function(data){
alert(data);
});
}
2.为什么请求之后,服务器返回了结果,而客户端没有接收到返回值?
后台请求了之后,jqeury ajax 里,一直没有返回值。调用 $.post 方法失败
于是使用 jqeury ajax 完整版:
$.ajax({
url: varRequestURL,
type: 'GET',
timeout: 120000,
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert('请求失败');
alert(XMLHttpRequest);
alert(textStatus);
alert(errorThrown);
},success: function(data){
alert("回调了");
alert(data);
}
});
超时之后,自动提示出 "请求失败"。
于是,判断 可能 jquery 有问题,于是不使用 jqeury 库,使用 javascript 的 ajax
function createXmlHttp(){
if (window.ActiveXObject) {
try {
return new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
return new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
}
}
if (window.XMLHttpRequest) {
return new XMLHttpRequest();
}
return null;
}
var varRequest ;
function ajaxSubmit(url){
alert('ajaxSubmit');
varRequest = createXmlHttp();
varRequest.open('GET',url,true);
varRequest.onreadystatechange=ajaxCallback;
varRequest.send(null);
}
function ajaxCallback(){
if(varRequest.readyState ==1){
}else if(varRequest.readyState==4){
if(varRequest.status=200){
try{
var data = varRequest.responseText;
alert(data);
}catch(err){
alert(err);
}
}
}
}
使用结果和使用 jqeury 代码 结果一样。
实在找不出问题所在,求大神解答!!!
另,Tomcat(6) 服务器 在 <Connector connectionTimeout="120000" > 我也已经配置。