与直接使用SpringableFuture相比,使用Spring @Async有什么优势?

与仅自行返回相比,使用Spring Async有什么优势?CompletableFuture


答案 1

两者之间没有“vs.”——这些是互补的技术:

  • CompletableFuture提供了一种便捷的方式来链接异步计算的不同阶段 - 比Spring的灵活性更高ListenableFuture;
  • @Async通过执行器的标准 Spring 配置,方便地管理后台任务和线程。

但两者可以合并(从春季4.2开始)。假设您要将以下方法转换为返回 :CompletableFuture

public String compute() {
    // do something slow
    return "my result";
}

你必须做什么:

  • 如果尚未完成:使用 和 Bean 配置应用程序@EnableAsyncExecutor
  • 使用@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

实际上,这相当于:

@Autowire
private Executor executor;

public CompletableFuture<String> computeAsync() {
    return CompletableFuture.supplyAsync(() -> {
        // do something slow
        return "my result";
    }, executor);
}

但它消除了以下需要:

  • 注入执行程序
  • 在调用中处理执行程序supplyAsync()
  • 将逻辑包装在 lambda 中(或将其提取到单独的方法)

答案 2

应用程序由容器管理。由于不鼓励自己生成 s,因此您可以让容器注入托管 。ThreadExecutor

@Service
class MyService {
  @Autowired
  private Executor executor;

  public CompletableFuture<?> compute() {
    return CompletableFuture.supplyAsync(() -> /* compute value */, executor);
  }
}

推荐