Alm*_*zak 4 java spring nonblocking spring-boot
我有一个休息方法:
@RequestMapping(value = "wash/washHistory", method = RequestMethod.GET, produces = "application/json;charset=UTF-8")
@ResponseBody
public DeferredResult<String> getWashHistory(@RequestParam(value = "sid", required = true, defaultValue = "") String sid,
HttpServletResponse response, HttpServletRequest request,
@RequestParam(value = "sort", defaultValue = "") String sortType,
@RequestParam(value = "order", defaultValue = "") String order,
@RequestParam(value = "limit", defaultValue = "") String limit,
@RequestParam(value = "offset", defaultValue = "") String offset) {
System.out.println("Thread: "+Thread.currentThread());
final Integer managerId = checkSession(sid);
DeferredResult<String> defResult = new DeferredResult<>();
new Thread(() -> {
final String result = washController.getWashHistory( managerId, order, sortType, limit, offset);
defResult.setResult(result);
}).start();
return defResult;
}
Run Code Online (Sandbox Code Playgroud)
在“getWashHistory”中,我抛出以下自定义异常:
throw new InvalidUserInputException("Wrong offset", this.getClass().getSimpleName(), "getWashHist", params);
Run Code Online (Sandbox Code Playgroud)
为了处理这个异常,我使用了以下类:
@ControllerAdvice
@EnableWebMvc
public class GlobalExceptionHandler {
@ExceptionHandler(value = InvalidUserInputException.class)
public ResponseEntity<String> invalidUserInputExc(InvalidUserInputException e) {
logger.log("GMoika", e.error().getClassName(), e.error().getMethodName(), e.error().getParams(), e.error().getCause());
return ResponseEntity.
status(HttpStatus.BAD_REQUEST).
body(e.error().getErrorCode());
}
}
Run Code Online (Sandbox Code Playgroud)
只要我不使用 DeferredResult,它就可以正常工作,但是当我想使用非阻塞方式时,会发生超时异常。我找到了一种解决方法:
defResult.onTimeout(new Runnable() {
@Override
public void run() {
defResult.setErrorResult("Explanation goes here.");
response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT); //or SC_NO_CONTENT
}
});
Run Code Online (Sandbox Code Playgroud)
但这不是我要找的,因为我用特定的构造函数抛出了自己的异常,以在抛出此异常的类中写入原因。在我的 GlobalExceptionHandler 类中,还有其他可能的方法来处理 DeferredResult 中的异常吗?
| 归档时间: |
|
| 查看次数: |
3369 次 |
| 最近记录: |