spring boot DeferredResult onError如何调用回调?

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

需要在Rest服务中执行一些异步处理,而不占用服务器的Http线程

我认为推迟结果将是一个不错的选择

但是,当我试图确保调用错误回调时,我无法这样做

以下是我天真的尝试:

@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;
}