【问题标题】:Difference between DeferedResult and CompletableFeatureDeferedResult 和 CompletableFuture 之间的区别
【发布时间】:2019-05-30 16:42:04
【问题描述】:

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

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

任何实时示例将不胜感激。

【问题讨论】:

    标签: java multithreading rest api asynchronous


    【解决方案1】:

    DeferredResultspring 类,它只是结果的容器(顾名思义),所以我们需要显式使用某种线程池(例如 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 - 例如onErrorSee here
    • CompletableFuture 有很多组合动作的选项。 See here

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

    另外,here 你有一个工作示例项目。

    【讨论】:

      猜你喜欢
      • 2022-08-20
      • 1970-01-01
      • 2016-05-21
      • 2018-05-14
      • 1970-01-01
      • 2021-12-25
      • 2020-05-10
      • 2014-09-20
      • 2010-10-28
      相关资源
      最近更新 更多