Tomcat + Spring 處理 “ClientAbortException” 引發的Broken pipe

在Tomcat環境中,如果用戶端主動放棄了請求,但是服務端尚未處理完成時,Tomcat會拋出一個"ClientAbortException"的 "IOException"。在Spring MVC框架中如何處理它顯得有點棘手,這里將會簡單說明如何進行處理。

為什么這個問題會顯得比較棘手?

在Spring MVC框架中我們一般會使用 "@ExceptionHandler"的注解來處理異常。通常情況下,異常被轉發到一個集中的處理方法中,進行合適的處理后返回給前端。但是出現上圖這種情況時,我們就無法再將response信息給返回回去了,因為用戶端的請求已經close掉了。

解決方法

我們在"@ExceptionHandler"方法里面捕捉到IOException且內容為"Broken pipe"的異常后,返回一個`null`給Spring框架,這樣框架層面就不會進行任何處理,也就不引發"JasperException"了。

```

@ExceptionHandler(IOException.class)

@ResponseStatus(HttpStatus.SERVICE_UNAVAILABLE)? //(1)

public Object exceptionHandler(IOException e, HttpServletRequest request) {

if (StringUtils.containsIgnoreCase(ExceptionUtils.getRootCauseMessage(e), "Broken pipe")) {? //(2)

return null;? ? ? ? //(1)? ? socket is closed, cannot return any response

} else {

return new HttpEntity<>(e.getMessage());? //(3)

}

}

```

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,837評論 18 139
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,925評論 6 342
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,740評論 18 399
  • =========================================================...
    lavor閱讀 3,505評論 0 5
  • 曾經聽過一段死亡錄音,里面是這樣的:你死了,你沒有氣了,你的靈魂就離開了身體,然后。你在房間里看見了別人把你的身體...
    帰零閱讀 214評論 1 1