首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CompletableFuture -运行引发java.util.concurrent.CompletionException的多个rest调用

CompletableFuture -运行引发java.util.concurrent.CompletionException的多个rest调用
EN

Stack Overflow用户
提问于 2021-09-27 16:26:53
回答 1查看 952关注 0票数 0

我有一个服务,它对另一个服务进行两个调用,然后组合这些响应并生成一个响应。

代码语言:javascript
运行
复制
public HashMap<String,Double> getResp(String requestJson, double defaultScore, String anomalySelfInclUrl,String anomalySelfExclUrl){
        CompletableFuture<Double> f1 = getHelper(requestJson,anomalySelfInclUrl);
        CompletableFuture <Double>f2=  getHelper(requestJson,anomalySelfExclUrl);
        AnomalyResponse anomalyResponse =new AnomalyResponse();
        HashMap<String,Double> respMap= new HashMap<>();
        CompletableFuture.allOf(f1,f2)
                .thenRun(() -> {
                    try {
                        Double anomalySelfModelRes = f1.get();
                        Double anomalyExclModelRes = f2.get();
                        respMap.put(Constants.selfInc,anomalySelfModelRes);
                        respMap.put(Constants.selfExcl,anomalyExclModelRes);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }).join();
        return respMap;
    }

public CompletableFuture<Double> getHelper(String requestJson, String url)  {
        return CompletableFuture.supplyAsync(() -> {
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON);
            HttpEntity<String> entity = new HttpEntity<>(requestJson, headers);
            String resp =restTemplate.postForObject(url, entity, String.class);
            JsonObject json = new JsonParser().parse(resp).getAsJsonObject();
            return json.get("score").getAsDouble();
        });

    }

在getResp方法中,我使用可完成的未来创建两个post调用(通过getHelper方法)。两个post调用完成后,我将它们添加到一个HashMap中并返回。但是,我在postForObject()方法中得到了以下错误。

代码语言:javascript
运行
复制
org.jboss.resteasy.spi.UnhandledException: java.util.concurrent.CompletionException

错误似乎发生了,因为被调用的服务没有接收到已发布的json数据和报头(包装在HttpEntity中)。怎么会发生这种事?在顺序调用过程中不会出现此问题。

EN

回答 1

Stack Overflow用户

发布于 2021-09-27 16:45:43

如果在可完成的将来执行方法时出现异常,则会引发完成异常。

假设您从API中获得401,您的restTemplate将抛出一个未经授权的异常。它将被包装在一个CompletionException中。

您可以从objOfCompletionException.getCause()方法调用获得实际响应。它将包含所有关于实际情况的详细信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69350109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档