直接使用Spring @Async和CompleteableFuture有什么好处?

时间:2017-06-21 19:55:01

标签: java spring asynchronous java-8 completable-future

使用Spring Async与仅自行归还CompletableFuture的优势是什么?

2 个答案:

答案 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";
}

你需要做什么:

  • 如果尚未完成:使用@EnableAsyncExecutor 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中,以便签名与调用者期望的匹配。