如何使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);
}

说明一下: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);
}

最新更新