我正在使用java开发一个restful webservices。我正在处理所有运行时和其他可能的异常情况,以向客户端发送有意义的响应。
当出现内存不足的情况时,如何确保客户端从服务器获得有意义的响应?
使用CXF和ExceptionMapper。
答案 0 :(得分: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();
}
}
答案 1 :(得分: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
的好时机:
答案 2 :(得分:0)
OutOfMemoryError
的问题在于它可能发生在任何线程中,包括不运行REST服务代码的线程。在服务器环境中,捕获任何Error
被认为是一种不好的做法。你应该让它冒泡调用堆栈,由服务器代码处理。
不要抓住它,最好调查内存耗尽并解决原因的原因。可能是您的服务器根本没有分配足够的内存,或者您在某处有内存泄漏。您需要分析问题,例如通过分析生成的堆转储,并确保它不再发生。
在像Java EE服务器这样的托管环境中,假设您可以通过捕获它来从OutOfMemeoryError中恢复,这是危险的并且通常是错误的。大多数情况下,你甚至无法抓住它,因为它发生在你无法控制的线索中。
答案 3 :(得分: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)写入响应。