使用Spring Async与仅自行归还CompletableFuture
的优势是什么?
答案 0 :(得分:7)
您的应用程序由容器管理。由于不鼓励您自己生成Thread
,因此您可以让容器注入托管Executor
。
@Service
class MyService {
@Autowired
private Executor executor;
public CompletableFuture<?> compute() {
return CompletableFuture.supplyAsync(() -> /* compute value */, executor);
}
}
答案 1 :(得分:5)
两者之间没有“ vs。”:这些是互补技术:
CompletableFuture
提供了一种链接异步计算不同阶段的便捷方式 - 比Spring ListenableFuture
更具灵活性; @Async
为您的后台任务和线程提供方便的管理,为您的执行者提供标准的Spring配置。但两者都可以合并(since Spring 4.2)。假设您要将以下方法转换为返回CompletableFuture
的后台任务:
public String compute() {
// do something slow
return "my result";
}
你需要做什么:
@EnableAsync
和Executor
bean @Async
CompletableFuture.completedFuture()
@Async
public CompletableFuture<String> computeAsync() {
// do something slow - no change to this part
// note: no need to wrap your code in a lambda/method reference,
// no need to bother about executor handling
return CompletableFuture.completedFuture("my result");
}
正如您所注意到的,您不必费心向执行者提交后台任务:Spring会为您解决这个问题。您只需将结果包装到已完成的CompletableFuture
中,以便签名与调用者期望的匹配。