以下方法将返回状态为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。
如何用相同的方法添加这些增强功能?
谢谢
答案 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
的情况下继续进行响应,直到代码中需要特定的响应为止。