我有一个服务,它对另一个服务进行两个调用,然后组合这些响应并生成一个响应。
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()方法中得到了以下错误。
org.jboss.resteasy.spi.UnhandledException: java.util.concurrent.CompletionException
错误似乎发生了,因为被调用的服务没有接收到已发布的json数据和报头(包装在HttpEntity中)。怎么会发生这种事?在顺序调用过程中不会出现此问题。
发布于 2021-09-27 16:45:43
如果在可完成的将来执行方法时出现异常,则会引发完成异常。
假设您从API中获得401,您的restTemplate
将抛出一个未经授权的异常。它将被包装在一个CompletionException中。
您可以从objOfCompletionException.getCause()
方法调用获得实际响应。它将包含所有关于实际情况的详细信息。
https://stackoverflow.com/questions/69350109
复制相似问题