/**
* Async work.
*/
@GetMapping(value = "/async/data/v4")
public void getDataAsyncV4() {
CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1000); // Sleep for 1 second (does not block the main thread)
return Data.builder().data("Some Data").threadId(Thread.currentThread().getId()).requestCameTime(System.currentTimeMillis()).build();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
});
}
/**
* Async doesn't work if return CompletableFuture.
*/
@GetMapping(value = "/async/data/v5")
public CompletableFuture<Data> getDataAsyncV5() {
return CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1000); // block main thread
return Data.builder().data("Some Data").threadId(Thread.currentThread().getId()).requestCameTime(System.currentTimeMillis()).build();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
});
}
我有两个如上所述的 API,问题是唯一返回 void 的 API 方法 getDataAsyncV4() 是异步运行的,而返回 CompletableFuture 的 API 方法 getDataAsyncV5() 总是阻塞主线程。我尝试了不同的方法,例如使用注释@EnableAsync,添加客户执行器..但它不起作用,我仍然不明白为什么。
要使 API 异步,您需要使用
@SpringBootApplication
注释来注释您的应用程序类(带有 @EnableAsync
的类)。然后用@Async
注释要异步运行的方法,并将该方法的返回类型更改为CompletableFuture<YourType>
。
该方法的返回语句将是这样的:
return CompletableFuture.completedFuture(yourType);
这是一个完整的例子:
@Async
public CompletableFuture<User> findUser(String user) throws InterruptedException {
User results = //...
return CompletableFuture.completedFuture(results);
}
更多详情请参阅官方文档:https://spring.io/guides/gs/async-method/