2016-08-02 92 views
0

我與解決一個報告的bug,在日誌顯示如何模擬客戶端中止請求?

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任務,是異常是由Tomcat的,當客戶端中止HTTP拋出請求。

我無法重現錯誤。我如何模擬客戶端中止?

我已經試過

  • 在請求處理程序添加Thread.sleep(10000),然後關閉瀏覽器的請求正在運行時 - 但是,這並不這樣做。

  • 以角度使用this technique從客戶端取消HTTP請求。

+1

'ClientAbortException'可能由多種情況引起。模擬客戶端中止將允許您解決您造成的客戶端中止,而不是後續客戶端中止。例如,這個異常可以由客戶端取消下載引發。模擬如何幫助您解決與超時有關的客戶端異常終止問題? –

+0

@JonnyHenly - 這是調試應用程序的第一步。如果我明白什麼樣的事情會導致'ClientAbortException',那麼我知道該找什麼。 – dwjohnston

+0

發現一個[Tomcat論壇帖子](http://tomcat.10.x6.nabble.com/Question-on-ClientAbortException-td2158595.html),聲明 - * APR'flushBuffer()'方法得到了否定的迴應來自APR庫中的本地'Socket.sendbb()'方法。通常的原因是客戶端斷開連接,但其他不常見的網絡錯誤可能會觸發它。* –

回答

0

好吧,有一些實驗 - 我找到了一種方法來做到這一點。

它看起來像是 - 如果在服務器正在寫入/清除輸出時,客戶端取消/超時的http請求,則會拋出錯誤。 (注:看起來好像回覆的大小也很重要 - 請參閱最後的筆記)。

有三件事情可能發生:


條件1:服務器寫入和客戶端超時之前刷新輸出。

響應被髮送回客戶端。

條件2:客戶端在服務器寫入和刷新輸出之前超時。

客戶端沒有收到響應,沒有服務器錯誤。

條件3:服務器寫入輸出時客戶端超時。

客戶端未收到迴應。服務器拋出ClientAbortExceptionjava.io.IOException)。


爲了模擬這三個條件,我們有三個變量玩:

  1. 的時間客戶端向超時
  2. 時間服務器燒傷獲取其結果。
  3. 服務器響應的大小。

下面是測試代碼進行模擬:

服務器端(這是一個Spring MVC的控制器)。

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

使用此我可以模擬三個條件與下列PARAMS:

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

NB它顯示爲如果尺寸的迴應也很重要。

例如:

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

這裏爲10000個字符串,我們得到了java.io.IOException即使發生刷新客戶端已經超時後好了,而它不是爲100個字符串。