gpt4 book ai didi

java - 如何模拟客户端中止请求?

转载 作者:可可西里 更新时间:2023-11-01 16:36:42 28 4
gpt4 key购买 nike

我的任务是解决报告的错误,其中日志显示

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 请求有棱角的。

最佳答案

好的,经过一些试验 - 我找到了一种方法。

它看起来像 - 如果一个 http 请求被客户端取消/超时,而服务器正在写入/刷新输出,那么将抛出错误。 (注意。 似乎响应的大小也很重要 - 请参阅末尾的注释)。

可能会发生三种情况:


条件 1: 服务器在客户端超时之前写入并刷新输出。

响应被发送回客户端。

条件 2:客户端在服务器写入和刷新输出之前超时。

客户端没有收到响应,没有服务器错误。

条件 3:客户端在服务器写入输出时超时。

客户端没有收到响应。服务器抛出 ClientAbortException (java.io.IOException)。


为了模拟这三种情况,我们使用三个变量:

  1. 客户端超时的时间
  2. 时间服务器开始获取结果。
  3. 服务器响应的大小。

下面是模拟它的测试代码:

服务器端(这是一个 Spring MVC Controller )。

@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);
});
};

使用它我可以用以下参数模拟这三个条件:

              Client Timeout     Server Burn Time      Num Strings
Condition 1: 1000 900 10000
Condition 2: 1000 2000 100
Condition 3: 1000 950 10000

注意 似乎响应的大小也很重要。

例如:

              Client Timeout     Server Burn Time      Num Strings
Condition 2: 1000 2000 100
Condition 3: 1000 2000 10000

这里对于 10000 个字符串,我们得到了 java.io.IOException,即使刷新发生在客户端超时之后,而对于 100 个字符串则不会。

关于java - 如何模拟客户端中止请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38732221/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com