2014-08-30 52 views
1

我正在開發一個使用java的寧靜web服務。我正在處理所有運行時和其他可能的異常情況,以向客戶端發送有意義的響應。REST風格的服務 - 避免堆棧跟蹤客戶端

當發生類似內存不足的情況時,如何確保客戶端從服務器獲得有意義的響應?

我正在使用CXF和ExceptionMapper。

+0

使用您的網址,在那裏你會處理引發的異常過濾器。除此之外,我更擔心應用中爲什麼會有OOM。 – 2014-08-30 16:15:13

+0

我以OOM爲例,請您詳細說明一下。 – 2014-08-30 16:22:14

+0

catch Throwable並返回一個錯誤代碼。 – jtahlborn 2014-08-30 16:34:53

回答

0

這不是一個例外;這是一個錯誤: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,當你明確分配的東西,可能是太大了:

+0

問題不在於如何捕捉它,而是**在哪裏**。 – 2014-08-30 16:42:02

+0

我不想抓住throwable。我正在尋找使用JAX-RS API的方法。 – 2014-08-30 17:44:06

1

在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(); 
    } 
} 
+0

我可以使用ExceptionHandler或ExceptionMapper處理所有運行時和檢查異常。但問題是我如何處理錯誤? – 2014-08-30 17:43:12

+0

你的意思是將消息和狀態碼一起發回給調用者嗎?嘗試[鏈接](http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-exceptionhandlers) – 2014-08-30 19:09:05

0

OutOfMemoryError的問題是,它可以在任何線程,包括不運行REST服務代碼線程發生。在服務器環境中,捕獲任何Error被認爲是不好的做法。你應該讓它冒出調用堆棧來處理服務器代碼。

而不是捕捉它,這將是更好的調查爲什麼你用盡內存和修復原因。這可能是因爲你的服務器沒有足夠的內存分配,或者你的內存泄漏。您需要分析問題,例如通過分析生成的堆轉儲,並確保它不再發生。

在像Java EE服務器這樣的託管環境中,假設您可以通過捕獲OutOfMemeoryError來恢復它,這是很危險的。大多數情況下,你甚至無法捕捉它,因爲它發生在你無法控制的線程中。

0

我使用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)的響應。

也有好文章http://www.journaldev.com/2651/spring-mvc-exception-handling-exceptionhandler-controlleradvice-handlerexceptionresolver-json-response-example

+0

我已經處理所有異常,我不知道如何處理錯誤。 – 2014-08-31 17:37:35