返回具有不同Http状态的Rest CompletableFuture

时间:2019-11-28 04:03:40

标签: java spring-boot asynchronous

以下方法将返回状态为OK的字符串列表。

@Async
@RequestMapping(path = "/device-data/search/asyncCompletable", method = RequestMethod.GET)
public CompletableFuture<ResponseEntity<?>> getValueAsyncUsingCompletableFuture() {
    logger.info("** start getValueAsyncUsingCompletableFuture **");
    // Get a future of type String
    CompletableFuture<List<String>> futureList = CompletableFuture.supplyAsync(() -> processRequest());
    return futureList.thenApply(dataList -> new ResponseEntity<List<String>>(dataList, HttpStatus.OK));
}

我想通过添加以下功能使此方法更可靠:

1)由于获取数据要花费一些时间(processRequest()),而与此同时,我想返回ACCEPTED状态,因此会向用户发送一些通知。

2)如果列表为空,那么我想返回状态NO_CONTENT。

如何用相同的方法添加这些增强功能?

谢谢

1 个答案:

答案 0 :(得分:1)

即使这是@Async函数,您仍在等待processRequest()完成,而thenApply()函数获取结果并将HttpStatus.NO_CONTENT设置为ResponseEntity尽管结果为状态。

您返回已处理的结果列表,就像进行synchronized调用一样。我宁愿让客户在立即响应后决定List是否为空。

@Async
@RequestMapping(path = "/device-data/search/asyncCompletable", method = RequestMethod.GET)
public CompletableFuture<ResponseEntity<List<String>>> getValueAsyncUsingCompletableFuture() {
    return CompletableFuture.supplyAsync(() -> ResponseEntity.accepted().body(processRequest()));
}

在客户端代码中,一旦通过RestTemplate的{​​{1}}获得响应,就等待响应或继续执行其余任务。

WebClient

这个CompletableFuture<ResponseEntity<List<String>>> response = ... // The response object, should be CompletableFuture<ResponseEntity<List<String>>> type hence returns from the upstream endpoint. System.out.println(response.get().getBody()); // 'get()' returns a instance of 'ReponseEntity<List<String>>', that's why 'getBody()' invokes. 是一个CompletableFuture.get()函数,它将等待当前线程,直到响应到达。您可以在没有blocking的情况下继续进行响应,直到代码中需要特定的响应为止。