CompletableFuture.supplyAsync()在不同的线程中运行指定的供应商(
ForkJoinThreadPool默认为)。
thenAccept()方法仅在上一次执行返回后运行。因此,在您的情况下它不会很快返回,您只是在另一个线程中调用长时间运行的调用。
而是定义一个公共对象,该对象充当缓存(例如
HttpSession),并
CompletableFuture返回存储在其中的对象。并
callURL()仅在缓存为空时执行:
@RequestMapping("/utilities/longProcess")public CompletableFuture<String> async(HttpServletResponse response, HttpServletRequest request) { HttpSession session = request.getSession(); return CompletableFuture.supplyAsync(() -> session.getAttribute("CACHED_RESULT")) .thenComposeAsync(obj -> { if (obj == null) { CompletableFuture.supplyAsync(() -> callUrl(request, response)) .thenAccept(result -> session.setAttribute("CACHED_RESULT", result)); return CompletableFuture.completedFuture("not ready yet"); } return CompletableFuture.completedFuture(obj.toString()); });您还可以添加一个时间戳记,以查看上次拨打电话的时间,
callUrl()以及拨打
callUrl()电话但尚未收到答案时不再打给您的电话。



