簡體   English   中英

RESTful服務-避免堆棧跟蹤到客戶端

[英]RESTful Services - Avoid stacktrace to client

我正在使用Java開發一個寧靜的Web服務。 我正在處理所有運行時和其他可能的異常情況,以向客戶端發送有意義的響應。

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

我正在使用CXF和ExceptionMapper。

在Spring中,您可以捕獲異常並將其映射到有意義的HTTP狀態代碼。 以下代碼可能對您YourException (將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();
  }
}

這也不例外。 這是一個錯誤: 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進行捕獲和恢復可能不會回收泄漏的內存。 您的應用程序將繼續運行一段時間,然后一次又一次地進行OOM,並且每次間隔都越來越短。

當您專門分配可能太大的東西時,可能至少有一個好時機來捕獲OutOfMemoryError

OutOfMemoryError的問題在於,它可能發生在任何線程中 ,包括未運行REST服務代碼的線程。 在服務器上下文中,捕獲任何Error被認為是不好的做法。 您應該讓它冒泡,使調用堆棧由服務器代碼處理。

與其抓住原因,不如調查原因,以解決內存不足並修復原因的方法。 可能是服務器根本沒有分配足夠的內存,或者某處內存泄漏。 您需要分析問題,例如,通過分析生成的堆轉儲,並確保不再發生此問題。

在像Java EE服務器這樣的托管環境中,假設您可以通過捕獲它而從OutOfMemeoryory錯誤中恢復,這是危險的,並且通常是錯誤的。 通常,您甚至無法捕獲它,因為它發生在您無法控制的線程中。

我為此使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM