【问题标题】:Java 8 acceptEither CompletableFuture ExampleJava 8 接受 CompletableFuture 示例
【发布时间】:2018-10-09 12:26:37
【问题描述】:

我是 Java 8 的新手,并且正在学习 CompletableFuture API。 我还有一个要求,我需要对第三方 API 进行异步调用,然后等待 7 秒。 7秒后,继续我的实际处理。 我还需要检查这 7 秒内的异步调用是否成功完成。如果是,则记录成功响应,或者如果异步调用异常完成,则在我的数据库中记录错误响应。

CompletableFure<Void> thridPartyCallFuture = Async Call to Third Party API;

//Wait for 7 seconds

我不需要从第三方 API 调用中检索任何响应,我只需要暂停 7 秒。

所以我试着打电话给thridPartyCallFuture.get(7, TimeUnit.SECONDS); 但问题是当我调用thridPartyCallFuture.isDone() 时它总是会返回true,但如果thridPartyCallFuture 异常完成,我不会知道,这对于在DB 中记录错误响应很重要。让我们考虑一下第三方 API 关闭并且我们的调用异常完成的场景。在这种情况下,isDone() 将返回 trueisCompletedExceptionally() 将返回 false

检查thridPartyCallFuture 是否成功完成,然后在数据库中记录成功响应。

检查thridPartyCallFuture是否异常完成,然后在数据库中记录错误响应。

我曾尝试探索acceptEither,但未能正确。

我知道在 Java 9 中引入了一个新方法 orTimeOut(int) 但在 Java 8 中我们没有这样的方法。

感谢任何帮助!

提前致谢。

【问题讨论】:

    标签: java java-8


    【解决方案1】:

    不知道为什么要等待 7 秒,即使结果更快返回。 以下代码显示了如何处理调用 API 的问题。 你是对的,Java 9 更好地支持超时。

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        CompletableFuture<Result> completableFuture = CompletableFuture
                .supplyAsync(() -> {
                    System.out.println("Making call to API...");
                    //call API here and if call fails, throw exception
                    //throw new RuntimeException("HTTP call failed");
                    return new Result(true, "Done");
                })
                .handle((o, throwable) -> o.isSuccess() ? o : new Result(false, throwable.getMessage()));
    
        Executors.newSingleThreadScheduledExecutor()
                .schedule(() -> {
                            Result result = completableFuture.getNow(new Result(false, "Timeout"));
                            System.out.println("Log to DB: "
                                    + result.isSuccess()
                                    + result.getMessage());
                            //other application method calls here
                        }, 7, TimeUnit.SECONDS);
    }
    

    --

    public class Result {
        private boolean success;
        private String message;
    
        public Result(boolean success, String message) {
            this.success = success;
            this.message = message;
        }
        //getters/setters
    }
    

    【讨论】:

    • 感谢 Kartik,这正是我想要的。要求最多等待 7 秒,如果没有将错误消息处理到 DB,或者如果我可以在 7 秒内收到响应,我可以处理成功消息。
    猜你喜欢
    • 2015-04-19
    • 2017-05-14
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多