【发布时间】:2019-05-30 16:42:04
【问题描述】:
我一直在用 Java 开发 Rest API。我想将它们转换为异步。我看到的两个选项是 DeferredResult 和 CompletableFeature。
我似乎没有找到这两者之间的区别,以及何时选择另一个。
任何实时示例将不胜感激。
【问题讨论】:
标签: java multithreading rest api asynchronous
我一直在用 Java 开发 Rest API。我想将它们转换为异步。我看到的两个选项是 DeferredResult 和 CompletableFeature。
我似乎没有找到这两者之间的区别,以及何时选择另一个。
任何实时示例将不胜感激。
【问题讨论】:
标签: java multithreading rest api asynchronous
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 你有一个工作示例项目。
【讨论】: