我一直在用Java开发Rest API。我想将它们转换为异步。我看到的两个选项是DeferredResult和CompletableFeature。
我似乎找不到这两者之间的区别,以及何时选择另一个。
任何实时示例都将受到赞赏。
答案 0 :(得分:0)
DeferredResult
是 spring 类,它只是结果的容器(顾名思义),因此我们需要显式使用某种线程池(例如ForkJoinPool)来异步运行我们的处理。 CompletableFuture
是java.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;
}
注意:
CompletableFuture
操作
ForkJoinPool
(可以配置)。DeferredResult
的情况下,logResult
将由Servlet容器(例如Tomcat)工作线程执行-不一定是在开始时就收到了请求。 CompletableFuture
异步运行处理,并且
返回DeferredResult
。DeferredResult
,您可以注册更多的回调,例如onCompleted
-例如onError
等。See here。CompletableFuture
有很多选择来组成动作。 See here。恕我直言,CompletableFuture
更优雅,功能更强大。
另外,here您有一个有效的示例项目。