首页 > 解决方案 > java - 如何使Java Rest API在前半部分处理后返回响应,然后在返回响应后继续下半部分?

问题描述

我有一个使用 Spring Boot 的 API 端点。这个端点的作用是调用另外两个 API 端点并处理它们的响应。

该过程的前半部分调用一个 API 端点,获取响应并将此响应与 202 Accepted 一起返回到表面。

202返回后,后台正在进行后半程。它从第一个 API 调用中获取响应并进一步处理它。

我尝试过ExecutorCompletableFuture但他们都在返回 202 后停止并且不会运行下半场,或者他们等到下半场完成后才返回 202。

这可能实现还是我正在寻找错误的设计?

这是一些示例代码:

@PostMapping("/user")
public ResponseEntity<?> processUser(@Valid @RequestBody UserRequestDto request,
                                            @RequestHeader("Authorization") String token) throws Exception {
    CompletableFuture<UserResponseDto> response = CompletableFuture.supplyAsync(() ->
            userService.processUser(request, token));
        
    userService.processUserSecond(response, token);

    return new ResponseEntity<>(response, HttpStatus.ACCEPTED);
}

标签: javaspringmultithreadingasynchronous

解决方案


明确一点:REST 端点包含两个调用 -processUserprocessUserSecond. 您想获得 的结果processUser,返回其结果并processUserSecond异步触发而不等待其结果。

请记住,在这种情况下,第一次调用必须是同步的,因为您等待其结果在后续调用中使用。后者可以是异步的。

@PostMapping("/user")
public ResponseEntity<?> processUser(@Valid @RequestBody UserRequestDto request,
                                            @RequestHeader("Authorization") String token) 
{
   // synchronous, waiting for the response to be used
   UserResponseDto response = userService.processUser(request, token);

   // asynchronous, fired without waiting for the response
   CompletableFuture.runAsync(() -> userService.processUserSecond(response, token));
       
   // return the result of the first (an only) synchronous call 
   return new ResponseEntity<>(response, HttpStatus.ACCEPTED);
}

推荐阅读