有三件事情可能發生:
條件1:服務器寫入和客戶端超時之前刷新輸出。
響應被髮送回客戶端。
條件2:客戶端在服務器寫入和刷新輸出之前超時。
客戶端沒有收到響應,沒有服務器錯誤。
條件3:服務器寫入輸出時客戶端超時。
客戶端未收到迴應。服務器拋出ClientAbortException
(java.io.IOException
)。
爲了模擬這三個條件,我們有三個變量玩:
- 的時間客戶端向超時
- 時間服務器燒傷獲取其結果。
- 服務器響應的大小。
下面是測試代碼進行模擬:
服務器端(這是一個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個字符串。
'ClientAbortException'可能由多種情況引起。模擬客戶端中止將允許您解決您造成的客戶端中止,而不是後續客戶端中止。例如,這個異常可以由客戶端取消下載引發。模擬如何幫助您解決與超時有關的客戶端異常終止問題? –
@JonnyHenly - 這是調試應用程序的第一步。如果我明白什麼樣的事情會導致'ClientAbortException',那麼我知道該找什麼。 – dwjohnston
發現一個[Tomcat論壇帖子](http://tomcat.10.x6.nabble.com/Question-on-ClientAbortException-td2158595.html),聲明 - * APR'flushBuffer()'方法得到了否定的迴應來自APR庫中的本地'Socket.sendbb()'方法。通常的原因是客戶端斷開連接,但其他不常見的網絡錯誤可能會觸發它。* –