我的任务是解决报告的错误,日志显示
org.apache.catalina.connector.ClientAbortException: java.io.IOException
...
Caused by: java.io.IOException
at org.apache.coyote.http11.InternalAprOutputBuffer.flushBuffer(InternalAprOutputBuffer.java:205)
There are several questions here about the ClientAbortException,我阅读它们和also the Tomcat javadoc的理解是,当客户端中止HTTP请求时,Tomcat会抛出异常。
我无法重现错误。如何模拟客户端中止?
我尝试了什么
在请求处理程序中添加Thread.sleep(10000)
,然后在请求运行时关闭浏览器 - 但是并没有这样做。
使用带有角度的this technique从客户端取消HTTP请求。
答案 0 :(得分:1)
好的,通过一些实验 - 我找到了一种方法。
它看起来是什么 - 如果在服务器正在写入/刷新输出时客户端取消/超时http请求,则会抛出错误。 ( NB。看起来响应的大小也很重要 - 最后请参阅我的说明)。
有三件事情可能发生:
条件1:服务器在客户端超时之前写入并刷新输出。
将响应发送回客户端。
条件2:客户端在服务器写入和刷新输出之前超时。
客户端没有收到响应,没有服务器错误。
条件3:当服务器正在写入输出时,客户端超时。
客户未收到回复。服务器抛出wrapper: {
backgroundColor: '#FFF',
marginBottom: Metrics.baseMargin,
borderRadius: 3,
},
(ClientAbortException
)。
为了模拟这三个条件,我们使用三个变量:
以下是模拟它的测试代码:
服务器端(这是一个Spring MVC控制器)。
java.io.IOException
客户端(Angular)
@RequestMapping(value = { "/debugGet" }, method = RequestMethod.GET)
@ResponseBody
public List<String> debugGet(@RequestParam int timeout, int numObjects) throws InterruptedException {
Thread.sleep(timeout);
List<String> l = new ArrayList<String>();
for (int i =0; i< numObjects; i++){
l.add(new String());
}
return l;
}
使用这个我可以使用以下参数模拟这三个条件:
this.debugGet = function(server, client, numObjects){
var httpProm = $http({
method: "GET",
url: "debugGet",
timeout: client,
params : {
timeout: server,
numObjects: numObjects}
});
httpProm.then(function(data){
console.log(data);
}, function(data){
console.log("error");
console.log(data);
});
};
NB 看起来响应的大小也很重要。
例如:
Client Timeout Server Burn Time Num Strings
Condition 1: 1000 900 10000
Condition 2: 1000 2000 100
Condition 3: 1000 950 10000
这里对于10000个字符串,我们得到 Client Timeout Server Burn Time Num Strings
Condition 2: 1000 2000 100
Condition 3: 1000 2000 10000
,即使在客户端超时后刷新发生得很好,而对于100个字符串也没有。