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

时间:2016-08-02 23:49:40

标签: java apache http tomcat

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

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请求。

1 个答案:

答案 0 :(得分:1)

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

它看起来是什么 - 如果在服务器正在写入/刷新输出时客户端取消/超时http请求,则会抛出错误。 ( NB。看起来响应的大小也很重要 - 最后请参阅我的说明)。

有三件事情可能发生:

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

将响应发送回客户端。

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

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

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

客户未收到回复。服务器抛出wrapper: { backgroundColor: '#FFF', marginBottom: Metrics.baseMargin, borderRadius: 3, }, ClientAbortException)。

为了模拟这三个条件,我们使用三个变量:

  1. 客户端超时的时间
  2. 时间服务器刻录获取结果。
  3. 服务器响应的大小。
  4. 以下是模拟它的测试代码:

    服务器端(这是一个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个字符串也没有。