Я хотел, чтобы асинхронное решение вызывало микросервисы, поэтому я пробовал и CompletableFuture, и ListenableFuture. Проблема, с которой я столкнулся в CompletableFuture, заключается в том, что если я хочу вызвать n вызовов асинхронных вызовов, я не могу использовать механизм зацикливания (возможно, потребуется объединить их) и каждая задача должна быть передана в библиотеку вручную.
С ListenableFuture я ожидаю точного ResponseEntity как того, на что ответили другие микроуслуги, включая сбои, но это снова должно быть добавлено в результате в список.
Будет ли разумно использовать AsyncRestTemplate, если мы используем ListenableFuture от guava.
В настоящее время я не могу использовать Reactor или rxJava из-за ограничений проекта.
public List<DeferredResult<?>> getAsync(List<AsyncLoadData> loaddata) {
List<AsyncTask> tasks = new ArrayList<>();
for (int i = 0; i < loaddata.size(); i++) {
AsyncTask task = new AsyncTask(resttemplate, loaddata.get(i));
tasks.add(task);
}
ListeningExecutorService pool = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(loaddata.size()));
List<DeferredResult<?>> retResponses = new ArrayList<>();
for (int i = 0; i < tasks.size(); i++) {
ListenableFuture<ResponseEntity<?>> stage = pool.submit(tasks.get(i));
Futures.addCallback(stage, new FutureCallback<ResponseEntity<?>>() {
@Override
public void onSuccess(ResponseEntity<?> result) {
DeferredResult<ResponseEntity<?>> def=new DeferredResult<>();
def.setResult(result);
retResponses.add(def);
}
@Override
public void onFailure(Throwable t) {
DeferredResult<?> def=new DeferredResult<>();
def.setErrorResult(t);
retResponses.add( def);
}
});
}
return retResponses;
}