我正在開發一個使用java的寧靜web服務。我正在處理所有運行時和其他可能的異常情況,以向客戶端發送有意義的響應。REST風格的服務 - 避免堆棧跟蹤客戶端
當發生類似內存不足的情況時,如何確保客戶端從服務器獲得有意義的響應?
我正在使用CXF和ExceptionMapper。
我正在開發一個使用java的寧靜web服務。我正在處理所有運行時和其他可能的異常情況,以向客戶端發送有意義的響應。REST風格的服務 - 避免堆棧跟蹤客戶端
當發生類似內存不足的情況時,如何確保客戶端從服務器獲得有意義的響應?
我正在使用CXF和ExceptionMapper。
這不是一個例外;這是一個錯誤:java.lang.OutOfMemoryError
你能趕上它,因爲它從Throwable
下降:
try {
// create lots of objects here and stash them somewhere
} catch (OutOfMemoryError E) {
// release some (all) of the above objects
}
但是,除非你做一些比較具體的東西(具體的代碼段內分配噸的東西,例如)你可能無法捕捉它,因爲你不知道它將從哪裏拋出。
如果問題的根本原因是內存泄漏,那麼捕獲和從OOM恢復的機會不會收回泄漏的內存。你的應用程序將繼續保持一段時間,然後再次,並再次減少間隔時間。
有可能是至少一個很好的時間來捕捉OutOfMemoryError
,當你明確分配的東西,可能是太大了:
問題不在於如何捕捉它,而是**在哪裏**。 – 2014-08-30 16:42:02
我不想抓住throwable。我正在尋找使用JAX-RS API的方法。 – 2014-08-30 17:44:06
在Spring中,你可以捕捉你的異常,並將它們映射到有意義的HTTP狀態碼。下面的代碼可能爲你工作(圖YourException
到HTTP 500):
@ControllerAdvice
public class ExceptionProcessor {
@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler({YourException.class})
public void serverError(HttpServletRequest req, Exception exception) {
// ...
// Print exception to server log
exception.printStackTrace();
}
}
我可以使用ExceptionHandler或ExceptionMapper處理所有運行時和檢查異常。但問題是我如何處理錯誤? – 2014-08-30 17:43:12
你的意思是將消息和狀態碼一起發回給調用者嗎?嘗試[鏈接](http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-exceptionhandlers) – 2014-08-30 19:09:05
與OutOfMemoryError
的問題是,它可以在任何線程,包括不運行REST服務代碼線程發生。在服務器環境中,捕獲任何Error
被認爲是不好的做法。你應該讓它冒出調用堆棧來處理服務器代碼。
而不是捕捉它,這將是更好的調查爲什麼你用盡內存和修復原因。這可能是因爲你的服務器沒有足夠的內存分配,或者你的內存泄漏。您需要分析問題,例如通過分析生成的堆轉儲,並確保它不再發生。
在像Java EE服務器這樣的託管環境中,假設您可以通過捕獲OutOfMemeoryError來恢復它,這是很危險的。大多數情況下,你甚至無法捕捉它,因爲它發生在你無法控制的線程中。
我使用HandlerExceptionResolver此:
public class MyHandlerExceptionResolver implements HandlerExceptionResolver {
@Override
@ExceptionHandler(value = Exception.class)
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
Your error processing goes here
}
}
所以每例外,進去resolveException,我寫相應的消息(在我來說,JSON)的響應。
我已經處理所有異常,我不知道如何處理錯誤。 – 2014-08-31 17:37:35
使用您的網址,在那裏你會處理引發的異常過濾器。除此之外,我更擔心應用中爲什麼會有OOM。 – 2014-08-30 16:15:13
我以OOM爲例,請您詳細說明一下。 – 2014-08-30 16:22:14
catch Throwable並返回一個錯誤代碼。 – jtahlborn 2014-08-30 16:34:53