DeferedResult和CompletableFeature之间的区别

时间:2019-05-30 16:42:04

标签: java multithreading rest api asynchronous

我一直在用Java开发Rest API。我想将它们转换为异步。我看到的两个选项是DeferredResult和CompletableFeature。

我似乎找不到这两者之间的区别,以及何时选择另一个。

任何实时示例都将受到赞赏。

1 个答案:

答案 0 :(得分:0)

DeferredResult spring 类,它只是结果的容器(顾名思义),因此我们需要显式使用某种线程池(例如ForkJoinPool)来异步运行我们的处理。 CompletableFuturejava.util.concurrent的一部分,并允许异步运行处理。它实现了Future,并且基本上具有组合,组合和执行异步计算步骤的能力。

两个选项的简单示例:

@GetMapping(value = "/deferredResult")
public DeferredResult<Boolean> useDeferredResult() {
    DeferredResult<Boolean> deferredResult = new DeferredResult<>();
    deferredResult.onCompletion(() -> logResult((Boolean)deferredResult.getResult()));
    ForkJoinPool.commonPool().submit(() -> {
        deferredResult.setResult(processRequest());
    });
    return deferredResult;
}

@GetMapping(value = "/completableFuture")
public CompletableFuture<Boolean> useCompletableFuture() {
    return CompletableFuture.supplyAsync(this::processRequest)
            .thenApplyAsync(this::logResult);
}

private boolean logResult(Boolean result) {
    System.out.println("Result: " + result);
    return true;
}

private boolean processRequest() {
    try {
        Thread.sleep(500);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return true;
}

注意:

  • 默认情况下,Spring将通过以下方式执行CompletableFuture操作 ForkJoinPool(可以配置)。
  • DeferredResult的情况下,logResult将由Servlet容器(例如Tomcat)工作线程执行-不一定是在开始时就收到了请求。
  • 可以(当我看不到任何东西时 原因)使用CompletableFuture异步运行处理,并且 返回DeferredResult
  • 使用DeferredResult,您可以注册更多的回调,例如onCompleted-例如onError等。See here
  • CompletableFuture有很多选择来组成动作。 See here

恕我直言,CompletableFuture更优雅,功能更强大。

另外,here您有一个有效的示例项目。