spring boot DeferredResult onError如何调用回调?
需要在Rest服务中执行一些异步处理,而不占用服务器的Http线程 我认为推迟结果将是一个不错的选择 但是,当我试图确保调用错误回调时,我无法这样做 以下是我天真的尝试:spring boot DeferredResult onError如何调用回调?,spring,spring-boot,spring-mvc,Spring,Spring Boot,Spring Mvc,需要在Rest服务中执行一些异步处理,而不占用服务器的Http线程 我认为推迟结果将是一个不错的选择 但是,当我试图确保调用错误回调时,我无法这样做 以下是我天真的尝试: @GetMapping("/getErrorResults") public DeferredResult<ResponseEntity<?>> getDeferredResultsError(){ final String METHOD_NAME = "getDeferredResultsE
@GetMapping("/getErrorResults")
public DeferredResult<ResponseEntity<?>> getDeferredResultsError(){
final String METHOD_NAME = "getDeferredResultsError";
logger.info("START : {}",METHOD_NAME);
DeferredResult<ResponseEntity<?>> deferredOutput = new DeferredResult<>();
ForkJoinPool.commonPool().submit(() -> {
logger.info("processing in separate thread");
int age = 0;
try {
age = age / 0;
}catch(Exception e) {
logger.error("we got some error");
logger.error(e);
throw e;
}
logger.info("after try catch block");
});
deferredOutput.onError((Throwable t) -> {
logger.error("<<< HERE !!! >>>");
deferredOutput.setErrorResult(
ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(t.getMessage()));
});
logger.info("done");
return deferredOutput;
}
}
因此,我的问题是“onError”是如何调用的?您需要将
DeferredResult
对象传递给异步操作,以便在成功或失败时更新它:
@GetMapping(value = "/getErrorResults")
public DeferredResult<ResponseEntity<String>> getDeferredResultsError() {
DeferredResult<ResponseEntity<String>> deferredResult = new DeferredResult<>();
ForkJoinPool.commonPool().submit(() -> {
System.out.println("Processing...");
int age = 0;
try {
age = age / 0;
deferredResult.setResult(ResponseEntity.ok("completed"));
}catch(Exception e) {
System.out.println("Failed to process: " + e.getMessage());
deferredResult.setErrorResult(
ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(e.getMessage()));
}
});
return deferredResult;
}
@GetMapping(value=“/getErrorResults”)
public DeferredResult GetDeferredResultError(){
DeferredResult DeferredResult=新的DeferredResult();
ForkJoinPool.commonPool().submit(()->{
System.out.println(“处理…”);
int年龄=0;
试一试{
年龄=年龄/0;
延迟结果.setResult(ResponseEntity.ok(“已完成”));
}捕获(例外e){
System.out.println(“未能处理:+e.getMessage());
deferredResult.setErrorResult(
ResponseEntity.status(HttpStatus.INTERNAL\u SERVER\u错误)
.body(如getMessage());
}
});
返回延迟结果;
}
在发布的代码中,您返回了DeferredResult
对象,而没有将其传递给异步操作。因此,在您返回它之后,SpringMVC将保持客户端连接,并等待DeferredResult
对象被分配某种结果。但在您的情况下,DeferredResult
不由异步操作持有,并且永远不会更新,因此您会得到“服务不可用”
您可以找到工作(灯光)项目示例
@GetMapping(value = "/getErrorResults")
public DeferredResult<ResponseEntity<String>> getDeferredResultsError() {
DeferredResult<ResponseEntity<String>> deferredResult = new DeferredResult<>();
ForkJoinPool.commonPool().submit(() -> {
System.out.println("Processing...");
int age = 0;
try {
age = age / 0;
deferredResult.setResult(ResponseEntity.ok("completed"));
}catch(Exception e) {
System.out.println("Failed to process: " + e.getMessage());
deferredResult.setErrorResult(
ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(e.getMessage()));
}
});
return deferredResult;
}