Я звоню четырем API, используя интерфейс CompletableFuture из java.util.concurrent с Java8. Я хочу сделать несколько вызовов покоя, объединить результаты и вернуть JSON.
Я пробовал с Future, это работало на меня. Тогда я тоже хотел попробовать CompletableFuture.
public Map<String, Map<String, Object>> getAllValuesInParallel2(RequestObj requestObj) {
Map<String, Map<String, Object>> response = new HashMap<>();
ExecutorService executor = Executors.newFixedThreadPool(6);
CompletableFuture.supplyAsync(() -> {
List<Template> keys = new ArrayList<>();
keys.add("mani");
return aClient.transform(keys, requestObj);
}, executor).thenApply(s -> {
putIntoResponse(response, s);
return true;
});
CompletableFuture.supplyAsync(() -> {
List<Template> keys = new ArrayList<>();
keys.add("gani");
return bClient.transform(keys, requestObj);
}, executor).thenApply(s -> {
putIntoResponse(response, s);
return true;
});
CompletableFuture.supplyAsync(() -> {
List<Template> keys = new ArrayList<>();
keys.add("priya");
return cClient.transform(keys, requestObj);
}, executor).thenApply(s -> {
putIntoResponse(response, s);
return true;
});
CompletableFuture.supplyAsync(() -> {
List<Template> keys = new ArrayList<>();
keys.add("ravi");
return dClient.transform(keys, requestObj);
}, executor).thenApply(s -> {
putIntoResponse(response, s);
return true;
});
return response;
}
private void putIntoResponse(Map<String, Map<String, Object>> response, List<Map<String, Object>> s) {
if(s.size() > 0) {
for (Map<String, Object> maps : s) {
if (maps != null && maps.containsKey("abcd")) {
String abcd = maps.get("abcd").toString();
if(!response.containsKey(abcd))
response.put(maps.get("abcd").toString(), maps);
else {
for (Map.Entry<String, Object> entry: maps.entrySet()) {
response.get(abcd).put(entry.getKey(), entry.getValue());
}
}
}
}
}
}
Я звоню четырем Аписам. Я получаю список Hashmap в качестве ответа для каждого API. Теперь результат каждого API должен быть объединен в один ответ, а именно, Карты карт. Итак, я хочу, чтобы, получив ответ от API, я поместил этот результат в хэш-карту.
Но я получаю пустой ответ. Здесь завершаемое будущее вызывает API, но сервер не ждет ответа на вызов и возвращает. Как дать серверу подождать? Пожалуйста, предложите метод, чтобы я мог выполнить этот вариант использования с completetableFuture. Кроме того, предложите какой-нибудь более чистый способ сделать это.
Ответ, получаемый от API:
{
{
"abcd": 1,
"cde": 2
},
{
"abcd": 2,
"cde": 3
}
}
Изучите приведенный выше ответ на:
{
"1" : {
"abcd": 1,
"cde": 2
},
"2":{
"abcd": 2,
"cde": 3
}
}